/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 7b1975e2fa56fc3c9859bec321f57cd3d75ec36b:


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 36  : pager.c,v 1.26
0350: 32 20 32 30 30 36 2f 30 33 2f 30 36 20 32 30 3a  2 2006/03/06 20:
0360: 35 35 3a 34 36 20 64 72 68 20 45 78 70 20 24 0a  55:46 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 28 28 69 6e 74 29 28  GERID(p) ((int)(
06e0: 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20  p->fd)).#define 
06f0: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
0700: 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a   ((int)fd)../*.*
0710: 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65  * The page cache
0720: 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61   as a whole is a
0730: 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20  lways in one of 
0740: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
0750: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
0760: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
0770: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0780: 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  che is not curre
0790: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
07a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
07b0: 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e            writin
07c0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
07d0: 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ile.  There is n
07e0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
07f0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
0800: 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  held in memory. 
0810: 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   This is the ini
0820: 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  tial.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
0840: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ate..**.**   PAG
0850: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20  ER_SHARED       
0860: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0870: 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  is reading the d
0880: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74    Writing is not
08b0: 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65   permitted.  The
08c0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20  re can be.**    
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64     multiple read
08f0: 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68  ers accessing th
0900: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a  e same database.
0910: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0920: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74           file at
0930: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
0940: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45  **.**   PAGER_RE
0950: 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73  SERVED      This
0960: 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73   process has res
0970: 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61  erved the databa
0980: 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  se for writing.*
0990: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
09a0: 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20          but has 
09b0: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79  not yet made any
09c0: 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20   changes.  Only 
09d0: 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20  one process.**  
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63       at a time c
0a00: 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64  an reserve the d
0a10: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72  atabase.  The or
0a20: 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  iginal.**       
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
0a50: 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  s not been modif
0a60: 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20  ied so other.** 
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20        processes 
0a90: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
0aa0: 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b  ding the on-disk
0ab0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0ac0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0ad0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  se file..**.**  
0ae0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
0af0: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0b00: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0b10: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0b40: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0b50: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0b60: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0b70: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
0b80: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
0b90: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
0ba0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bc0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0bd0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  ng..**.**   PAGE
0be0: 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20  R_SYNCED        
0bf0: 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  The pager moves 
0c00: 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72  to this state fr
0c10: 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  om PAGER_EXCLUSI
0c20: 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  VE.**           
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65              afte
0c40: 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
0c50: 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
0c60: 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ten to the.**   
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0c90: 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
0ca0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
0cb0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
0cc0: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e             disk.
0cd0: 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e   All that remain
0ce0: 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65  s to do is to re
0cf0: 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  move the.**     
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61    journal file a
0d20: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
0d30: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20  on will be.**   
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a      committed..*
0d60: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61  *.** The page ca
0d70: 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20  che comes up in 
0d80: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d90: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a  he first time a.
0da0: 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
0db0: 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  get() occurs, th
0dc0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0dd0: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0de0: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0df0: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0e00: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0e10: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0e20: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0e30: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0e40: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0e50: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0e60: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0e70: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
0e80: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0e90: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0ea0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0eb0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0ec0: 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65  that sqlite_page
0ed0: 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  _write() can onl
0ee0: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0ef0: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0f00: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0f10: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0f20: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0f30: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0f40: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0f50: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0f60: 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61  VED.).** The tra
0f70: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0f80: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0f90: 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e  s when before an
0fa0: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
0fb0: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
0fc0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74  abase file.  Aft
0fd0: 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67  er an sqlite3pag
0fe0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  er_rollback().**
0ff0: 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72   or sqlite_pager
1000: 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73  _commit(), the s
1010: 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74  tate goes back t
1020: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
1030: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1040: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1050: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1060: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1070: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1080: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1090: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
10a0: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
10b0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
10c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
10d0: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
10e0: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10f0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
1100: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
1110: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49        5../*.** I
1120: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  f the SQLITE_BUS
1130: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  Y_RESERVED_LOCK 
1140: 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20  macro is set to 
1150: 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d  true at compile-
1160: 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61  time,.** then fa
1170: 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f  iled attempts to
1180: 20 67 65 74 20 61 20 72 65 73 65 72 76 65 64 20   get a reserved 
1190: 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65  lock will invoke
11a0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
11b0: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f  ck..** This is o
11c0: 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ff by default.  
11d0: 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73  To see why, cons
11e0: 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
11f0: 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20  ng scenario:.** 
1200: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65  .** Suppose thre
1210: 61 64 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  ad A already has
1220: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
1230: 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73 65 72  nd wants a reser
1240: 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72  ved lock..** Thr
1250: 65 61 64 20 42 20 61 6c 72 65 61 64 79 20 68 61  ead B already ha
1260: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
1270: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65  k and wants an e
1280: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
1290: 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61  If.** both threa
12a0: 64 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65  ds are using the
12b0: 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ir busy callback
12c0: 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  s, it might be a
12d0: 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65   long time.** be
12e0: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
12f0: 74 68 72 65 61 64 73 20 67 69 76 65 20 75 70 20  threads give up 
1300: 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f  and allows the o
1310: 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e  ther to proceed.
1320: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
1330: 68 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20  hread trying to 
1340: 67 65 74 20 74 68 65 20 72 65 73 65 72 76 65 64  get the reserved
1350: 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71   lock gives up q
1360: 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74  uickly.** (if it
1370: 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69   never invokes i
1380: 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ts busy callback
1390: 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  ) then the conte
13a0: 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a  ntion will be.**
13b0: 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c   resolved quickl
13c0: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
13d0: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
13e0: 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65  ED_LOCK.# define
13f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1400: 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e  ERVED_LOCK 0.#en
1410: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1420: 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c  macro rounds val
1430: 75 65 73 20 75 70 20 73 6f 20 74 68 61 74 20 69  ues up so that i
1440: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1450: 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20  n address it.** 
1460: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1470: 20 62 65 20 61 6e 20 61 64 64 72 65 73 73 20 74   be an address t
1480: 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74  hat is aligned t
1490: 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  o an 8-byte boun
14a0: 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  dary..*/.#define
14b0: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
14c0: 28 58 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e  (X)   (((X)+7)&~
14d0: 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69  7)../*.** Each i
14e0: 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  n-memory image o
14f0: 66 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20  f a page begins 
1500: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
1510: 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68  ng header..** Th
1520: 69 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c  is header is onl
1530: 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69  y visible to thi
1540: 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20  s pager module. 
1550: 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63   The client.** c
1560: 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70  ode that calls p
1570: 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74  ager sees only t
1580: 68 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  he data that fol
1590: 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e  lows the header.
15a0: 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f  .**.** Client co
15b0: 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73  de should call s
15c0: 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
15d0: 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72  e() on a page pr
15e0: 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a  ior to making.**
15f0: 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f   any modificatio
1600: 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e  ns to that page.
1610: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
1620: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1630: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1640: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1650: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
1660: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1670: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
1680: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
1690: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
16a0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
16b0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
16c0: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
16d0: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
16e0: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
16f0: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1700: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1710: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1720: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1730: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1740: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1750: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1760: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
1770: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
1780: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
1790: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
17a0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
17b0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
17c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
17d0: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
17e0: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
17f0: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69  3pager_write() i
1800: 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  s called and.** 
1810: 69 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e  is cleared again
1820: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63   when the page c
1830: 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65  ontent is writte
1840: 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72  n back to the or
1850: 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  iginal.** databa
1860: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65  se file..*/.type
1870: 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72  def struct PgHdr
1880: 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50   PgHdr;.struct P
1890: 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a  gHdr {.  Pager *
18a0: 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
18b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
18c0: 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68  ager to which th
18d0: 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20  is page belongs 
18e0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
1910: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
1920: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
1930: 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72  *pNextHash, *pPr
1940: 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68  evHash;  /* Hash
1950: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
1960: 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20   for PgHdr.pgno 
1970: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1980: 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65  tFree, *pPrevFre
1990: 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20  e;  /* Freelist 
19a0: 6f 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  of pages where n
19b0: 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64  Ref==0 */.  PgHd
19c0: 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20  r *pNextAll;    
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19e0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
19f0: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
1a00: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
1a10: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
1a20: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
1a30: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1a40: 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61  */.  u8 inJourna
1a50: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1a60: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68      /* TRUE if h
1a70: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
1a80: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
1a90: 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20  u8 inStmt;      
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ab0: 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65  * TRUE if in the
1ac0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
1ad0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
1ae0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
1af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1b00: 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  E if we need to 
1b10: 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67  write back chang
1b20: 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  es */.  u8 needS
1b30: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
1b40: 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a         /* Sync j
1b50: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72  ournal before wr
1b60: 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  iting this page 
1b70: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
1b80: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
1b90: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64      /* Disable d
1ba0: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
1bb0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
1bc0: 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66    short int nRef
1bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
1bf0: 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  ers of this page
1c00: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
1c10: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
1c20: 20 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61       /* Dirty pa
1c30: 67 65 73 20 73 6f 72 74 65 64 20 62 79 20 50 67  ges sorted by Pg
1c40: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66 64  Hdr.pgno */.#ifd
1c50: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1c60: 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65  PAGES.  u32 page
1c70: 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f  Hash;.#endif.  /
1c80: 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
1c90: 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65  ze bytes of page
1ca0: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69   data follow thi
1cb0: 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a  s header */.  /*
1cc0: 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
1cd0: 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74  tes of local dat
1ce0: 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67  a follow the pag
1cf0: 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e data */.};../*
1d00: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65  .** For an in-me
1d10: 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61  mory only databa
1d20: 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69  se, some extra i
1d30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  nformation is re
1d40: 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20  corded about.** 
1d50: 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61  each page so tha
1d60: 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65  t changes can be
1d70: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28   rolled back.  (
1d80: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  Journal files ar
1d90: 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f  e not.** used fo
1da0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
1db0: 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c  bases.)  The fol
1dc0: 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  lowing informati
1dd0: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  on is added to.*
1de0: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  * the end of eve
1df0: 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66  ry EXTRA block f
1e00: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1e10: 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  abases..**.** Th
1e20: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  is information c
1e30: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61  ould have been a
1e40: 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f  dded directly to
1e50: 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63   the PgHdr struc
1e60: 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65  ture..** But the
1e70: 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20  n it would take 
1e80: 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79  up an extra 8 by
1e90: 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f  tes of storage o
1ea0: 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a  n every PgHdr.**
1eb0: 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62   even for disk-b
1ec0: 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20  ased databases. 
1ed0: 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75   Splitting it ou
1ee0: 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e  t saves 8 bytes.
1ef0: 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c    This.** is onl
1f00: 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30  y a savings of 0
1f10: 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65  .8% but those pe
1f20: 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70  rcentages add up
1f30: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1f40: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67  uct PgHistory Pg
1f50: 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20  History;.struct 
1f60: 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38  PgHistory {.  u8
1f70: 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20   *pOrig;     /* 
1f80: 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65  Original page te
1f90: 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20  xt.  Restore to 
1fa0: 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72  this on a full r
1fb0: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20  ollback */.  u8 
1fc0: 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54  *pStmt;     /* T
1fd0: 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74  ext as it was at
1fe0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1ff0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
2000: 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f  atement */.};../
2010: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
2020: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
2030: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
2040: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
2050: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
2060: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
2070: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  EC1(P,D,N,X) if(
2080: 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b   P->xCodec!=0 ){
2090: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
20a0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
20b0: 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  }.# define CODEC
20c0: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
20d0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30  r*)(P->xCodec!=0
20e0: 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43  ?P->xCodec(P->pC
20f0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44  odecArg,D,N,X):D
2100: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
2110: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
2120: 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20  ) /* NO-OP */.# 
2130: 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c  define CODEC2(P,
2140: 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44  D,N,X) ((char*)D
2150: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2160: 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65  Convert a pointe
2170: 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74  r to a PgHdr int
2180: 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  o a pointer to i
2190: 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62  ts data.** and b
21a0: 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64  ack again..*/.#d
21b0: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44  efine PGHDR_TO_D
21c0: 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29  ATA(P)  ((void*)
21d0: 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69  (&(P)[1])).#defi
21e0: 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52  ne DATA_TO_PGHDR
21f0: 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29  (D)  (&((PgHdr*)
2200: 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e  (D))[-1]).#defin
2210: 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  e PGHDR_TO_EXTRA
2220: 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28  (G,P) ((void*)&(
2230: 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29  (char*)(&(G)[1])
2240: 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d  )[(P)->pageSize]
2250: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
2260: 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20  TO_HIST(P,PGR)  
2270: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  \.            ((
2280: 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68  PgHistory*)&((ch
2290: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28  ar*)(&(P)[1]))[(
22a0: 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28  PGR)->pageSize+(
22b0: 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a  PGR)->nExtra])..
22c0: 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f  /*.** How big to
22d0: 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
22e0: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  able used for lo
22f0: 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79  cating in-memory
2300: 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67   pages.** by pag
2310: 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 6d  e number. This m
2320: 61 63 72 6f 20 6c 6f 6f 6b 73 20 61 20 6c 69 74  acro looks a lit
2330: 74 6c 65 20 73 69 6c 6c 79 2c 20 62 75 74 20 69  tle silly, but i
2340: 73 20 65 76 61 6c 75 61 74 65 64 0a 2a 2a 20 61  s evaluated.** a
2350: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 20  t compile-time, 
2360: 6e 6f 74 20 72 75 6e 2d 74 69 6d 65 20 28 61 74  not run-time (at
2370: 20 6c 65 61 73 74 20 66 6f 72 20 67 63 63 20 74   least for gcc t
2380: 68 69 73 20 69 73 20 74 72 75 65 29 2e 0a 2a 2f  his is true)..*/
2390: 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41  .#define N_PG_HA
23a0: 53 48 20 28 5c 0a 20 20 28 4d 41 58 5f 50 41 47  SH (\.  (MAX_PAG
23b0: 45 53 3e 31 30 32 34 29 3f 32 30 34 38 3a 20 5c  ES>1024)?2048: \
23c0: 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 35 31  .  (MAX_PAGES>51
23d0: 32 29 3f 31 30 32 34 3a 20 5c 0a 20 20 28 4d 41  2)?1024: \.  (MA
23e0: 58 5f 50 41 47 45 53 3e 32 35 36 29 3f 35 31 32  X_PAGES>256)?512
23f0: 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53  : \.  (MAX_PAGES
2400: 3e 31 32 38 29 3f 32 35 36 3a 20 5c 0a 20 20 28  >128)?256: \.  (
2410: 4d 41 58 5f 50 41 47 45 53 3e 36 34 29 3f 31 32  MAX_PAGES>64)?12
2420: 38 3a 36 34 20 5c 0a 29 0a 0a 2f 2a 0a 2a 2a 20  8:64 \.)../*.** 
2430: 48 61 73 68 20 61 20 70 61 67 65 20 6e 75 6d 62  Hash a page numb
2440: 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61  er.*/.#define pa
2450: 67 65 72 5f 68 61 73 68 28 50 4e 29 20 20 28 28  ger_hash(PN)  ((
2460: 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48 2d 31  PN)&(N_PG_HASH-1
2470: 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  ))../*.** A open
2480: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
2490: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
24a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
24b0: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  cture..**.** Pag
24c0: 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62  er.errCode may b
24d0: 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
24e0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
24f0: 52 52 55 50 54 2c 20 53 51 4c 49 54 45 5f 50 52  RRUPT, SQLITE_PR
2500: 4f 54 4f 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c  OTOCOL.** or SQL
2510: 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f  ITE_FULL. Once o
2520: 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ne of the first 
2530: 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63  three errors occ
2540: 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73  urs, it persists
2550: 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72  .** and is retur
2560: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
2570: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
2580: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
2590: 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
25a0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
25b0: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
25c0: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
25d0: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
25e0: 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65  he.** next succe
25f0: 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69  ssful rollback i
2600: 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  s performed on t
2610: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
2620: 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  Also,.** SQLITE_
2630: 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66  FULL does not af
2640: 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33  fect the sqlite3
2650: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
2660: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
2670: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
2680: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
2690: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
26a0: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
26b0: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
26c0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
26d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
26e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
26f0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
2700: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2710: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2720: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2730: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2740: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2750: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2770: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2780: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2790: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
27a0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
27b0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
27c0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
27d0: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
27e0: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
27f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2800: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
2810: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
2820: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
2830: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
2840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
2850: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
2860: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
2870: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
2880: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
2890: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
28a0: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
28b0: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
28c0: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
28d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28e0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
28f0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
2900: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
2910: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
2920: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
2930: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
2940: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
2950: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
2960: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
2970: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2980: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
2990: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
29a0: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29c0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
29d0: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
29e0: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 65 72   etc. */.  u8 er
29f0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2a00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2a10: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
2a20: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38  f errors */.  u8
2a30: 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20   tempFile;      
2a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
2a50: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
2a60: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
2a70: 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20  u8 readOnly;    
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a90: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
2aa0: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
2ab0: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ad0: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
2ae0: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
2af0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
2b00: 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b    u8 dirtyCache;
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b20: 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20   True if cached 
2b30: 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67  pages have chang
2b40: 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ed */.  u8 alway
2b50: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
2b60: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64      /* Disable d
2b70: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
2b80: 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  or all pages */.
2b90: 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20    u8 memDb;     
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb0: 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74   True to inhibit
2bc0: 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f   all file I/O */
2bd0: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bf0: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
2c00: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
2c10: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
2c20: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20  .  int dbSize;  
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2c50: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  s in the file */
2c60: 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a  .  int origDbSiz
2c70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2c80: 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20  * dbSize before 
2c90: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
2ca0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  ge */.  int stmt
2cb0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2cc0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
2cd0: 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65  atabase (in page
2ce0: 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  s) at stmt_begin
2cf0: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  () */.  int nRec
2d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d20: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
2d30: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
2d40: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
2d50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d60: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
2d70: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
2d80: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
2d90: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2db0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
2dc0: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
2dd0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
2de0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
2df0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
2e00: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
2e10: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
2e20: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
2e30: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
2e40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e50: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
2e60: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
2e70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2e80: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
2e90: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2ea0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2eb0: 6e 4d 61 78 50 61 67 65 3b 20 20 20 20 20 20 20  nMaxPage;       
2ec0: 20 20 20 20 20 20 20 20 2f 2a 20 48 69 67 68 20          /* High 
2ed0: 77 61 74 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50  water mark of nP
2ee0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  age */.  int nRe
2ef0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2f00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f10: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2f20: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
2f30: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
2f40: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2f50: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2f60: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2f70: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
2f80: 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75   */.  u8 *aInJou
2f90: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
2fa0: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
2fb0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
2fc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fd0: 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74  */.  u8 *aInStmt
2fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ff0: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
3000: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
3010: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
3020: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
3030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3040: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3050: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
3060: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
3070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3080: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3090: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
30a0: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
30b0: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
30c0: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
30d0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
30e0: 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a  es */.  OsFile *
30f0: 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  fd, *jfd;       
3100: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
3110: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
3120: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
3130: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74   */.  OsFile *st
3140: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
3150: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
3160: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61  ptor for the sta
3170: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3180: 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65  l*/.  BusyHandle
3190: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
31a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
31b0: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
31c0: 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  er */.  PgHdr *p
31d0: 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20  First, *pLast;  
31e0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
31f0: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
3200: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
3210: 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ed;        /* Fi
3220: 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69  rst free page wi
3230: 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  th PgHdr.needSyn
3240: 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  c==0 */.  PgHdr 
3250: 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *pAll;          
3260: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3270: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3280: 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20  PgHdr *pStmt;   
3290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
32a0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
32b0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
32c0: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36  bjournal */.  i6
32d0: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
32e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
32f0: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
3300: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3310: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
3320: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
3330: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
3340: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
3350: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3360: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3370: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3380: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3390: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
33a0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
33b0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
33c0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
33d0: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
33e0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
33f0: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36   started */.  i6
3400: 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20  4 stmtJSize;    
3410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
3420: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
3430: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
3440: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
3450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3460: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
3470: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
3480: 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53  back */.#ifdef S
3490: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
34a0: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f   nHit, nMiss, nO
34b0: 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63 68  vfl;     /* Cach
34c0: 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c  e hits, missing,
34d0: 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f   and LRU overflo
34e0: 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ws */.  int nRea
34f0: 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  d,nWrite;       
3500: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
3510: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
3520: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
3530: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
3540: 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f  r)(void*,int); /
3550: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
3560: 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67  ine when freeing
3570: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
3580: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76 6f   (*xReiniter)(vo
3590: 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43  id*,int);   /* C
35a0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
35b0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
35c0: 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  pages */.  void 
35d0: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
35e0: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
35f0: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
3600: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
3610: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
3620: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
3630: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
3640: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
3650: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
3660: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
3670: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
3680: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
3690: 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23  er to PgHdr */.#
36a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
36b0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
36c0: 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70  EMENT.  Pager *p
36d0: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
36e0: 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69      /* Linked li
36f0: 73 74 20 6f 66 20 70 61 67 65 72 73 20 69 6e 20  st of pagers in 
3700: 74 68 69 73 20 74 68 72 65 61 64 20 2a 2f 0a 23  this thread */.#
3710: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
3720: 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  If SQLITE_TEST i
3730: 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 69  s defined then i
3740: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 72  ncrement the var
3750: 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a 2a  iable given in.*
3760: 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a  * the argument.*
3770: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3780: 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54 45  TEST.# define TE
3790: 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b 0a  ST_INCR(x)  x++.
37a0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54  #else.# define T
37b0: 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e 64  EST_INCR(x).#end
37c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  if../*.** Journa
37d0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
37e0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
37f0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
3800: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
3810: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
3820: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
3830: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
3840: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
3850: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
3860: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
3870: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3880: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
3890: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
38a0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
38b0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
38c0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
38d0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
38e0: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
38f0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
3900: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
3910: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
3920: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
3930: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
3940: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
3950: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
3960: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
3970: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
3980: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
3990: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
39a0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
39b0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
39c0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
39d0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
39e0: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
39f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
3a00: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
3a10: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
3a20: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3a30: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
3a40: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
3a50: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
3a60: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
3a70: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
3a80: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
3a90: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
3aa0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
3ab0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
3ac0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
3ad0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
3ae0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
3af0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
3b00: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
3b10: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
3b20: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
3b30: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
3b40: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
3b50: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
3b60: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
3b70: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
3b80: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
3b90: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
3ba0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
3bb0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
3bc0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
3bd0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
3be0: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
3bf0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
3c00: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
3c10: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
3c20: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
3c30: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
3c40: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
3c50: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
3c60: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
3c70: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
3c80: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
3c90: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
3ca0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
3cb0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
3cc0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
3cd0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
3ce0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3cf0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
3d00: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
3d10: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
3d20: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
3d30: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
3d40: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
3d50: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
3d60: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
3d70: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
3d80: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
3d90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
3da0: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
3db0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
3dc0: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
3dd0: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
3de0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
3df0: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
3e00: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
3e10: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
3e20: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
3e30: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
3e40: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
3e50: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
3e60: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
3e70: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
3e80: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
3e90: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
3ea0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
3eb0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3ec0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
3ed0: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
3ee0: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
3ef0: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
3f00: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
3f10: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
3f20: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
3f30: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
3f40: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
3f50: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
3f60: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
3f70: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
3f80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
3f90: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
3fa0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
3fb0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
3fc0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
3fd0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
3fe0: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
3ff0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
4000: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
4010: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
4020: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
4030: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
4040: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
4050: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20  default size of 
4060: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a 2f  a disk sector.*/
4070: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
4080: 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a 0a  ECTOR_SIZE 512..
4090: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
40a0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
40b0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
40c0: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
40d0: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
40e0: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
40f0: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
4100: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
4110: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
4120: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
4130: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
4140: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
4150: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
4160: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
4170: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
4180: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
4190: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
41a0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
41b0: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
41c0: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
41d0: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
41e0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
41f0: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
4200: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
4210: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
4220: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
4230: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
4240: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
4250: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
4260: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
4270: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
4280: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4290: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
42a0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
42b0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
42c0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
42d0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45  7483647../*.** E
42e0: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
42f0: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
4300: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
4310: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
4320: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
4330: 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f  t pager3_refinfo
4340: 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73  _enable = 0;.  s
4350: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
4360: 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a  _refinfo(PgHdr *
4370: 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  p){.    static i
4380: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
4390: 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69  if( !pager3_refi
43a0: 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74  nfo_enable ) ret
43b0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
43c0: 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
43d0: 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64      "REFCNT: %4d
43e0: 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
43f0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
4400: 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
4410: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20  TA(p), p->nRef. 
4420: 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b     );.    cnt++;
4430: 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20     /* Something 
4440: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
4450: 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20  int on */.  }.# 
4460: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
4470: 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  )  pager_refinfo
4480: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
4490: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65  ne REFINFO(X).#e
44a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
44b0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
44c0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
44d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
44e0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
44f0: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
4500: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
4510: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4520: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
4530: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
4540: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4550: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4560: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
4570: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
4580: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4590: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
45a0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
45b0: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20  OsFile *fd, u32 
45c0: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
45d0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
45e0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
45f0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
4600: 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20 69  sizeof(ac));.  i
4610: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4620: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
4630: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
4640: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
4650: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
4660: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4680: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4690: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
46a0: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
46b0: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
46c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
46d0: 75 74 33 32 62 69 74 73 28 63 68 61 72 20 2a 61  ut32bits(char *a
46e0: 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 61  c, u32 val){.  a
46f0: 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29  c[0] = (val>>24)
4700: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d   & 0xff;.  ac[1]
4710: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
4720: 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28  xff;.  ac[2] = (
4730: 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a  val>>8) & 0xff;.
4740: 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20    ac[3] = val & 
4750: 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  0xff;.}../*.** W
4760: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4770: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
4780: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
4790: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
47a0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
47b0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
47c0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
47d0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
47e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
47f0: 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ite32bits(OsFile
4800: 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a   *fd, u32 val){.
4810: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
4820: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
4830: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
4840: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
4850: 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ac, 4);.}../*.**
4860: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4870: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
4880: 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74   'offset' from t
4890: 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
48a0: 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65  ed by.** page he
48b0: 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61  ader 'p'..*/.sta
48c0: 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65  tic u32 retrieve
48d0: 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c  32bits(PgHdr *p,
48e0: 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20   int offset){.  
48f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
4900: 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73  c;.  ac = &((uns
4910: 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44  igned char*)PGHD
4920: 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66  R_TO_DATA(p))[of
4930: 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20  fset];.  return 
4940: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
4950: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
4960: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
4970: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
4980: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
4990: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
49a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
49b0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
49c0: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
49d0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
49e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
49f0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
4a00: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
4a10: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
4a20: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
4a30: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
4a40: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
4a50: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4a60: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
4a70: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4a80: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
4a90: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
4aa0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4ab0: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
4ac0: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
4ad0: 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52 4f  PT or SQLITE_PRO
4ae0: 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65 72  TOCOL,.** the er
4af0: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
4b00: 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73  istent. All subs
4b10: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
4b20: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a   on this Pager.*
4b30: 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  * will immediate
4b40: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
4b50: 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  me error code..*
4b60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
4b70: 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
4b80: 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
4b90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4ba0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
4bb0: 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65  TE_FULL || pPage
4bc0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
4bd0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 0a  TE_OK );.  if( .
4be0: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46      rc==SQLITE_F
4bf0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 3d 3d 53  ULL ||.    rc==S
4c00: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20  QLITE_IOERR ||. 
4c10: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f     rc==SQLITE_CO
4c20: 52 52 55 50 54 20 7c 7c 0a 20 20 20 20 72 63 3d  RRUPT ||.    rc=
4c30: 3d 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  =SQLITE_PROTOCOL
4c40: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
4c50: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
4c60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4c70: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4c80: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
4c90: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
4ca0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
4cb0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
4cc0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
4cd0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
4ce0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
4cf0: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
4d00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
4d10: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
4d20: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
4d30: 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  r *)PGHDR_TO_DAT
4d40: 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28  A(pPage);.  for(
4d50: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50  i=0; i<pPage->pP
4d60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
4d70: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
4d80: 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b   (hash+i)^pData[
4d90: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
4da0: 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   hash;.}../*.** 
4db0: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
4dc0: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
4dd0: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
4de0: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
4df0: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
4e00: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
4e10: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
4e20: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
4e30: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
4e40: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
4e50: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
4e60: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
4e70: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
4e80: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
4e90: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4ea0: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
4eb0: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
4ec0: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
4ed0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
4ee0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
4ef0: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
4f00: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
4f10: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
4f20: 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67   || MEMDB || pPg
4f30: 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20  ->dirty || .    
4f40: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d    pPg->pageHash=
4f50: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
4f60: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
4f70: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
4f80: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  AGE(x).#endif../
4f90: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
4fa0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
4fb0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
4fc0: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
4fd0: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
4fe0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
4ff0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
5000: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
5010: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
5020: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
5030: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
5040: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
5050: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
5060: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
5070: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
5080: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
5090: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
50a0: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
50b0: 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72  Free() *pzMaster
50c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
50d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
50e0: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
50f0: 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73  t *pzMaster is s
5100: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
5110: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
5120: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5130: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
5140: 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c  al(OsFile *pJrnl
5150: 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65  , char **pzMaste
5160: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5170: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
5180: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
5190: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
51a0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
51b0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
51c0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
51d0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
51e0: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  *pzMaster = 0;..
51f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5200: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
5210: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
5220: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
5230: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
5240: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5250: 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73  3OsSeek(pJrnl, s
5260: 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63  zJ-16);.  if( rc
5270: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5280: 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20  turn rc;. .  rc 
5290: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
52a0: 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  nl, &len);.  if(
52b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
52c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
52d0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
52e0: 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  Jrnl, &cksum);. 
52f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5300: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5310: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5320: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
5330: 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72  gic, 8);.  if( r
5340: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
5350: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
5360: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
5370: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5380: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5390: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
53a0: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
53b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
53c0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d  turn rc;..  *pzM
53d0: 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29  aster = (char *)
53e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
53f0: 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d  +1);.  if( !*pzM
5400: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  aster ){.    ret
5410: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5420: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5430: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
5440: 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  , *pzMaster, len
5450: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5460: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
5470: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
5480: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
5490: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  er = 0;.    retu
54a0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
54b0: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
54c0: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
54d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
54e0: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
54f0: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
5500: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70      cksum -= (*p
5510: 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d  zMaster)[i];.  }
5520: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
5530: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
5540: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
5550: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
5560: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
5570: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
5580: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
5590: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
55a0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
55b0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
55c0: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
55d0: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
55e0: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
55f0: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
5600: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
5610: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
5620: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
5630: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
5640: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
5650: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
5660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a  .  }else{.    (*
5670: 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d  pzMaster)[len] =
5680: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
5690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
56a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
56b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
56c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
56d0: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
56e0: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
56f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
5700: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
5710: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
5720: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
5730: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
5740: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
5750: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
5760: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
5770: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
5780: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
5790: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
57a0: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
57f0: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5810: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5830: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
5850: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
5860: 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61  c int seekJourna
5870: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
5880: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
5890: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
58a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
58b0: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
58c0: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
58d0: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
58e0: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
58f0: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
5900: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
5910: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
5920: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5930: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
5940: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
5950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
5960: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
5970: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
5980: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
5990: 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b  nalOff = offset;
59a0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
59b0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
59c0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
59d0: 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a  rnalOff);.}../*.
59e0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
59f0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
5a00: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
5a10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
5a20: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
5a30: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
5a40: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
5a50: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
5a60: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
5a70: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
5a80: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
5a90: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
5aa0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
5ab0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
5ac0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
5ad0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
5ae0: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
5af0: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
5b00: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
5b10: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
5b20: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
5b30: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
5b40: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
5b50: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
5b60: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
5b70: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
5b80: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
5b90: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
5ba0: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
5bb0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
5bc0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
5bd0: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
5be0: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
5bf0: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
5c00: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
5c10: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
5c20: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
5c30: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5c40: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
5c50: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
5c60: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 0a 20 20  lMagic)+16];..  
5c70: 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75  int rc = seekJou
5c80: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
5c90: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
5ca0: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
5cb0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
5cc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5cd0: 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  f;.  if( pPager-
5ce0: 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29  >stmtHdrOff==0 )
5cf0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
5d00: 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65  mtHdrOff = pPage
5d10: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20  r->journalHdr;. 
5d20: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
5d30: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
5d40: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5d50: 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a  );..  /* FIX ME:
5d60: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73   .  **.  ** Poss
5d70: 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72  ibly for a pager
5d80: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
5d90: 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
5da0: 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e  l magic should n
5db0: 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  ot.  ** be writt
5dc0: 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73  en until nRec is
5dd0: 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61   filled in as pa
5de0: 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a  rt of next syncJ
5df0: 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a  ournal(). .  **.
5e00: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61    ** Actually ma
5e10: 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  ybe the whole jo
5e20: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f  urnal header sho
5e30: 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75  uld be delayed u
5e40: 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70  ntil that.  ** p
5e50: 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75  oint. Think abou
5e60: 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d  t this..  */.  m
5e70: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
5e80: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
5e90: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5ea0: 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e  ic));.  /* The n
5eb0: 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46  Rec Field. 0xFFF
5ec0: 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e  FFFFF for no-syn
5ed0: 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20  c journals. */. 
5ee0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
5ef0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
5f00: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
5f10: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66  er->noSync ? 0xf
5f20: 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
5f30: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
5f40: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
5f50: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
5f60: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  e3Randomness(siz
5f70: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
5f80: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
5f90: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
5fa0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
5fb0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
5fc0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
5fd0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
5fe0: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
5ff0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
6000: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6010: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6020: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
6030: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
6040: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
6050: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
6060: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
6070: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
6080: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6090: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
60a0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
60b0: 72 53 69 7a 65 29 3b 0a 20 20 72 63 20 3d 20 73  rSize);.  rc = s
60c0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
60d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
60e0: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
60f0: 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er));..  /* The 
6100: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
6110: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
6120: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
6130: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
6140: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
6150: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
6160: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
6170: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
6180: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
6190: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
61a0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
61b0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
61c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
61d0: 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
61e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
61f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6200: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
6210: 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a  fd, "\000", 1);.
6220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6230: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6240: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6250: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
6260: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
6270: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
6280: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
6290: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
62a0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
62b0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
62c0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
62d0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
62e0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
62f0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
6300: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
6310: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
6320: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6330: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
6340: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
6350: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
6360: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
6370: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
6380: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
6390: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
63a0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
63b0: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
63c0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
63d0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
63e0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
63f0: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
6400: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
6410: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
6420: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
6430: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
6440: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6450: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
6460: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
6470: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
6480: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
6490: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
64a0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
64b0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
64c0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
64d0: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
64e0: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
64f0: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
6500: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
6510: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
6520: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
6530: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
6540: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6550: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
6560: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
6570: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
6580: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
6590: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
65a0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
65b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
65c0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
65d0: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
65e0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
65f0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
6600: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6610: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6620: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6630: 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
6640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
6650: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6660: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
6670: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
6680: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
6690: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
66a0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
66b0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
66c0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
66d0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
66e0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63   rc;..  if( memc
66f0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6700: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6710: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
6720: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6730: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
6740: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6750: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65  Pager->jfd, pNRe
6760: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
6770: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6780: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6790: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
67a0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
67b0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
67c0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
67d0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
67e0: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
67f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6800: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
6810: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
6820: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
6830: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
6840: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
6850: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
6860: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
6870: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
6880: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
6890: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
68a0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
68b0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
68c0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
68d0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
68e0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
68f0: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
6900: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
6910: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
6920: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
6930: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
6940: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
6950: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6960: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  s(pPager->jfd, (
6970: 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73  u32 *)&pPager->s
6980: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
6990: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
69a0: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
69b0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
69c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
69d0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
69e0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
69f0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
6a00: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75  rnalOff);.  retu
6a10: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
6a20: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
6a30: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
6a40: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
6a50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6a60: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
6a70: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
6a80: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
6a90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6aa0: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
6ab0: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
6ac0: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
6ad0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
6ae0: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
6af0: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
6b00: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
6b10: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
6b20: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
6b30: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
6b40: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
6b50: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
6b60: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
6b70: 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  **.** + 4 bytes:
6b80: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
6b90: 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65  ** + N bytes: le
6ba0: 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
6bb0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20  ournal name..** 
6bc0: 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20  + 4 bytes: N.** 
6bd0: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
6be0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
6bf0: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20  hecksum..** + 8 
6c00: 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
6c10: 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
6c20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6c30: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
6c40: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
6c50: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
6c60: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
6c70: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  name..**.** If z
6c80: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
6c90: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
6ca0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
6cb0: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
6cc0: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
6cd0: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
6ce0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
6cf0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
6d00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
6d10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
6d20: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
6d30: 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74   int len; .  int
6d40: 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d   i; .  u32 cksum
6d50: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
6d60: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
6d70: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
6d80: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
6d90: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
6da0: 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  er) return SQLIT
6db0: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
6dc0: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
6dd0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
6de0: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
6df0: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
6e00: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
6e10: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
6e20: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
6e30: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
6e40: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
6e50: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
6e60: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
6e70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6e80: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
6e90: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
6ea0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
6eb0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
6ec0: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
6ed0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
6ee0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
6ef0: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
6f00: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
6f10: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
6f20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6f30: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6f40: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
6f50: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
6f60: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
6f70: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
6f80: 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a  r->jfd, PAGER_MJ
6f90: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
6fa0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6fb0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6fc0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6fd0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6fe0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
6ff0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
7000: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7010: 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74   rc;..  put32bit
7020: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
7030: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
7040: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
7050: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
7060: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
7070: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7080: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
7090: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
70a0: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
70b0: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
70c0: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
70d0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
70e0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
70f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7100: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
7110: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
7120: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
7130: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
7140: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
7150: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
7160: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
7170: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
7180: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
7190: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
71a0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
71b0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
71c0: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
71d0: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
71e0: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
71f0: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
7200: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
7210: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
7220: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
7230: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
7240: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
7250: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
7260: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
7270: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64  ic void page_add
7280: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  _to_stmt_list(Pg
7290: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
72a0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
72b0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
72c0: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
72d0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
72e0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  pPg->pPrevStmt==
72f0: 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53  0 && pPg->pNextS
7300: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d  tmt==0 );.  pPg-
7310: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
7320: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
7330: 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  tmt ){.    pPage
7340: 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53  r->pStmt->pPrevS
7350: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  tmt = pPg;.  }. 
7360: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7370: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
7380: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
7390: 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69   = pPg;.  pPg->i
73a0: 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61  nStmt = 1;.}.sta
73b0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
73c0: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
73d0: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
73e0: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53  .  if( !pPg->inS
73f0: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
7400: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  if( pPg->pPrevSt
7410: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
7420: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
7430: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67  ->pNextStmt==pPg
7440: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
7450: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
7460: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
7470: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
7480: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
7490: 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67  ager->pStmt==pPg
74a0: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   );.    pPg->pPa
74b0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
74c0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
74d0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
74e0: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  tStmt ){.    ass
74f0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53  ert( pPg->pNextS
7500: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  tmt->pPrevStmt==
7510: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
7520: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
7530: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Stmt = pPg->pPre
7540: 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67  vStmt;.  }.  pPg
7550: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
7560: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
7570: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e  t = 0;.  pPg->in
7580: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
7590: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
75a0: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
75b0: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
75c0: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
75d0: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
75e0: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
75f0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
7600: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
7610: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
7620: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
7630: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
7640: 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  *p = pPager->aHa
7650: 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67  sh[pager_hash(pg
7660: 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  no)];.  while( p
7670: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
7680: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
7690: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
76a0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
76b0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
76c0: 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61  atabase and clea
76d0: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
76e0: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
76f0: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
7700: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
7710: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
7720: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
7730: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
7740: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
7750: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
7760: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
7770: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
7780: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
7790: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
77a0: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
77b0: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
77c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
77d0: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
77e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
77f0: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
7800: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
7810: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
7820: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
7830: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
7840: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
7850: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
7860: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
7870: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
7880: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
7890: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
78a0: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
78b0: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
78c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
78d0: 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ll = 0;.  memset
78e0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
78f0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
7900: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61  ->aHash));.  pPa
7910: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
7920: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7930: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
7940: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7950: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
7960: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7970: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7980: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7990: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
79a0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
79b0: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
79c0: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
79d0: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
79e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
79f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
7a00: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
7a10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7a20: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7a30: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7a40: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7a50: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
7a60: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
7a70: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7a80: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7a90: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
7aa0: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
7ab0: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7ac0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7ad0: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
7ae0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
7af0: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
7b00: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
7b10: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
7b20: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
7b30: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
7b40: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
7b50: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
7b60: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
7b70: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
7b80: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
7b90: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
7ba0: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
7bb0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
7bc0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
7bd0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
7be0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
7bf0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
7c00: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
7c10: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
7c20: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
7c30: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
7c40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7c50: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
7c60: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
7c70: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
7c80: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
7c90: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
7ca0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
7cb0: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
7cc0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
7cd0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
7ce0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7cf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7d00: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7d10: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
7d20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
7d30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
7d40: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
7d50: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
7d60: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
7d70: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
7d80: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
7d90: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
7da0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
7db0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
7dc0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
7dd0: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
7de0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
7df0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
7e00: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
7e10: 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  nc = 0;.#ifdef S
7e20: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
7e30: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
7e40: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
7e50: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
7e60: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
7e70: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
7e80: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
7e90: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
7ea0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7eb0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
7ec0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
7ed0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
7ee0: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
7ef0: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
7f00: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63  l==0 );.  }.  rc
7f10: 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   = sqlite3OsUnlo
7f20: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
7f30: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70  HARED_LOCK);.  p
7f40: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
7f50: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 70  AGER_SHARED;.  p
7f60: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
7f70: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
7f80: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
7f90: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
7fa0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
7fb0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
7fc0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
7fd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7fe0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
7ff0: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
8000: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
8010: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
8020: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
8030: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
8040: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
8050: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8060: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
8070: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
8080: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
8090: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
80a0: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
80b0: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
80c0: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
80d0: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
80e0: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
80f0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
8100: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
8110: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
8120: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
8130: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
8140: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8150: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
8160: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
8170: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
8180: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
8190: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
81a0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
81b0: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
81c0: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
81d0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
81e0: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
81f0: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
8200: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
8210: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
8220: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
8230: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
8240: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
8250: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
8260: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
8270: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
8280: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
8290: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
82a0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
82b0: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
82c0: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
82d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
82e0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
82f0: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
8300: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
8310: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
8320: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
8330: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
8340: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
8350: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
8360: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
8370: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
8380: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
8390: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
83a0: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
83b0: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
83c0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
83d0: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
83e0: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
83f0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
8400: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
8410: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
8420: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
8430: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
8440: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
8450: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
8460: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
8470: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
8480: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
8490: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
84a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
84b0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
84c0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
84d0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
84e0: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
84f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8500: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
8510: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
8520: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
8530: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
8540: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
8550: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
8560: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
8570: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
8580: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
8590: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
85a0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
85b0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
85c0: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
85d0: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
85e0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
85f0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
8600: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8610: 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74  OsFile *jfd, int
8620: 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e   useCksum){.  in
8630: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
8640: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
8650: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
8660: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
8670: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
8680: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
8690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
86a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
86b0: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
86c0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
86d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
86e0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
86f0: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
8700: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
8710: 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d  8 aData[SQLITE_M
8720: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20  AX_PAGE_SIZE];  
8730: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
8740: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
8750: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
8760: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
8770: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
8780: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
8790: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
87a0: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
87b0: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
87c0: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
87d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
87e0: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
87f0: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
8800: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 0a 0a  ger->stfd) );...
8810: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
8820: 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20  s(jfd, &pgno);. 
8830: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8840: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8860: 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61  Read(jfd, &aData
8870: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8880: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
8890: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
88a0: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
88b0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
88c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
88d0: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
88e0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
88f0: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
8900: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
8910: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
8920: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
8930: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
8940: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
8950: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8960: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
8970: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
8980: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
8990: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
89a0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
89b0: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
89c0: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
89d0: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
89e0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
89f0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8a00: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
8a10: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
8a20: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
8a30: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8a40: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8a50: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
8a60: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
8a70: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8a80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8a90: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
8aa0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
8ab0: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b  d32bits(jfd, &ck
8ac0: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
8ad0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
8ae0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8af0: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69  lOff += 4;.    i
8b00: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
8b10: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
8b20: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
8b30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8b40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
8b50: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
8b60: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
8b70: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
8b80: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
8b90: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
8ba0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
8bb0: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
8bc0: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
8bd0: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
8be0: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
8bf0: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
8c00: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
8c10: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
8c20: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
8c30: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
8c40: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
8c50: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
8c60: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
8c70: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
8c80: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
8c90: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
8ca0: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
8cb0: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
8cc0: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
8cd0: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
8ce0: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
8cf0: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
8d00: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
8d10: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
8d20: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
8d30: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
8d40: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
8d50: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
8d60: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
8d70: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
8d80: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
8d90: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
8da0: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
8db0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
8dc0: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
8dd0: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
8de0: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
8df0: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
8e00: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
8e10: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
8e20: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
8e30: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
8e40: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
8e50: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
8e60: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
8e70: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
8e80: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
8e90: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
8ea0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   in the main rol
8eb0: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
8ec0: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
8ed0: 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41  if a full ROLLBA
8ee0: 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  CK occurs after 
8ef0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  the statement.  
8f00: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
8f10: 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69  full ROLLBACK wi
8f20: 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74  ll not restore t
8f30: 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f  he page to its o
8f40: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e  riginal.  ** con
8f50: 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69  tent.  Two condi
8f60: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65  tions must be me
8f70: 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
8f80: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
8f90: 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29  .  ** files. (1)
8fa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
8fb0: 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28  st be locked.  (
8fc0: 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
8fd0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
8fe0: 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  * page content i
8ff0: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
9000: 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
9010: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
9020: 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63   not in.  ** cac
9030: 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  he or else it is
9040: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
9050: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70  ync==0..  */.  p
9060: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
9070: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
9080: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9090: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
90a0: 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67  EXCLUSIVE || pPg
90b0: 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33 28  !=0 );.  TRACE3(
90c0: 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
90d0: 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
90e0: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b  (pPager), pgno);
90f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9100: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
9110: 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30  USIVE && (pPg==0
9120: 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   || pPg->needSyn
9130: 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20  c==0) ){.    rc 
9140: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
9150: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
9160: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
9170: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9180: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9190: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
91a0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
91b0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
91c0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
91d0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
91e0: 69 66 28 20 70 50 67 20 29 20 70 50 67 2d 3e 64  if( pPg ) pPg->d
91f0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
9200: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
9210: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
9220: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
9230: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
9240: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
9250: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
9260: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
9270: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
9280: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
9290: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
92a0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
92b0: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
92c0: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
92d0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
92e0: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
92f0: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
9300: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
9310: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
9320: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
9330: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
9340: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
9350: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
9360: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
9370: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
9380: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
9390: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
93a0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
93b0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
93c0: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
93d0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
93e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
93f0: 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a  estructor ){  /*
9400: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75  ** FIX ME:  Shou
9410: 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e  ld this be xRein
9420: 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70  it? ***/.      p
9430: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
9440: 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72  or(pData, pPager
9450: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9460: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
9470: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
9480: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
9490: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
94a0: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
94b0: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
94c0: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
94d0: 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 3);.  }.  retu
94e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
94f0: 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
9500: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
9510: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
9520: 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
9530: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
9540: 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
9550: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
9560: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
9570: 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
9580: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
9590: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
95a0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
95b0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
95c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
95d0: 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
95e0: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
95f0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
9600: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
9610: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
9620: 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  l child journals
9630: 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20  ..** To tell if 
9640: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
9650: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c   can be deleted,
9660: 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f   check to each o
9670: 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65  f the.** childre
9680: 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64  n.  If all child
9690: 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d  ren are either m
96a0: 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74  issing or do not
96b0: 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64   refer to.** a d
96c0: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20  ifferent master 
96d0: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68  journal, then th
96e0: 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  is master journa
96f0: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
9700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9710: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
9720: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
9730: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
9740: 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65    int master_ope
9750: 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20  n = 0;.  OsFile 
9760: 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63  *master = 0;.  c
9770: 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
9780: 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
9790: 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
97a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
97b0: 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
97c0: 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
97d0: 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
97e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
97f0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
9800: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9810: 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63  exclusively in c
9820: 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ase some other p
9830: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72  rocess.  ** is r
9840: 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74  unning this rout
9850: 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68  ine also. Not th
9860: 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20  at it makes too 
9870: 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e  much difference.
9880: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
9890: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
98a0: 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73  ly(zMaster, &mas
98b0: 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ter);.  if( rc!=
98c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
98d0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
98e0: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
98f0: 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
9900: 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73 74  3OsFileSize(mast
9910: 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
9920: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
9930: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
9940: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9950: 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
9960: 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
9970: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
9980: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
9990: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  Ptr = 0;..    /*
99a0: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
99b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
99c0: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
99d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
99e0: 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f    ** sqliteMallo
99f0: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
9a00: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
9a10: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
9a20: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
9a30: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
9a40: 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  eMalloc(nMasterJ
9a50: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
9a60: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
9a70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
9a80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9a90: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
9aa0: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
9ab0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
9ac0: 65 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73  ead(master, zMas
9ad0: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73  terJournal, nMas
9ae0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
9af0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9b00: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
9b10: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a  ter_out;..    zJ
9b20: 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
9b30: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
9b40: 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
9b50: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
9b60: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
9b70: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9b80: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a  3OsFileExists(zJ
9b90: 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
9ba0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
9bb0: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
9bc0: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
9bd0: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
9be0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
9bf0: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
9c00: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
9c10: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9c20: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
9c30: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
9c40: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
9c50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9c60: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
9c70: 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65  /.        OsFile
9c80: 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20   *journal = 0;. 
9c90: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20         int c;.. 
9ca0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
9cb0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
9cc0: 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75  y(zJournal, &jou
9cd0: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
9ce0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
9d00: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
9d10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
9d20: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
9d30: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72  sterJournal(jour
9d40: 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72  nal, &zMasterPtr
9d50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9d60: 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e  e3OsClose(&journ
9d70: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
9d80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
9da0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9db0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
9dc0: 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
9dd0: 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  r!=0 && strcmp(z
9de0: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
9df0: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
9e00: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
9e10: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
9e20: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
9e30: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
9e40: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
9e50: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
9e60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
9e70: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
9e80: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9e90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9ea0: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
9eb0: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
9ec0: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
9ed0: 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f   }.  .  sqlite3O
9ee0: 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29  sDelete(zMaster)
9ef0: 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
9f00: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a  :.  if( zMasterJ
9f10: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ournal ){.    sq
9f20: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
9f30: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
9f40: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
9f50: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
9f60: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
9f70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9f80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
9f90: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
9fa0: 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77  he cache agree w
9fb0: 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
9fc0: 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  isk.  In other w
9fd0: 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20  ords,.** reread 
9fe0: 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65  the disk to rese
9ff0: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
a000: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
a010: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a020: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72  called after a r
a030: 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68  ollback in which
a040: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72   some of the dir
a050: 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65  ty cache.** page
a060: 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e  s had never been
a070: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
a080: 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74  disk.  We need t
a090: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a  o roll back the.
a0a0: 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74  ** cache content
a0b0: 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74   and the easiest
a0c0: 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20   way to do that 
a0d0: 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  is to reread the
a0e0: 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   old content.** 
a0f0: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69  back from the di
a100: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
a110: 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  t pager_reload_c
a120: 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
a130: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
a140: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
a150: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70  LITE_OK;.  for(p
a160: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
a170: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
a180: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68  NextAll){.    ch
a190: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d  ar zBuf[SQLITE_M
a1a0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20  AX_PAGE_SIZE];. 
a1b0: 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72     if( !pPg->dir
a1c0: 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ty ) continue;. 
a1d0: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
a1e0: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
a1f0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
a200: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a210: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
a220: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
a230: 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e  Size*(i64)(pPg->
a240: 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20  pgno-1));.      
a250: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a260: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
a270: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
a280: 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
a290: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a2a0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
a2b0: 20 20 20 54 52 41 43 45 33 28 22 52 45 46 45 54     TRACE3("REFET
a2c0: 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  CH %d page %d\n"
a2d0: 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
a2e0: 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
a2f0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
a300: 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  eak;.      CODEC
a310: 31 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20  1(pPager, zBuf, 
a320: 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20  pPg->pgno, 2);. 
a330: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a340: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
a350: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a360: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a370: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
a380: 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47   memcmp(zBuf, PG
a390: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a3a0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a3b0: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ze) ){.      mem
a3c0: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
a3d0: 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50  A(pPg), zBuf, pP
a3e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a3f0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
a400: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
a410: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
a420: 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f  xReiniter(PGHDR_
a430: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), 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 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a460: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
a470: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
a480: 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
a490: 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
a4a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a4b0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
a4c0: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  0;.    pPg->dirt
a4d0: 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
a4e0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
a4f0: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
a500: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
a510: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
a520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
a540: 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  ate the main fil
a550: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  e of the given p
a560: 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62  ager to the numb
a570: 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69  er of pages.** i
a580: 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  ndicated..*/.sta
a590: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
a5a0: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
a5b0: 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29  ager, int nPage)
a5c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
a5d0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
a5e0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
a5f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
a600: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
a610: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
a620: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
a630: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  );.}../*.** Play
a640: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
a650: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
a660: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
a670: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
a680: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
a690: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
a6a0: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
a6b0: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
a6c0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
a6d0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
a6e0: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
a6f0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
a700: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
a710: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
a720: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
a730: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
a740: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
a750: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
a760: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
a770: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
a780: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
a790: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
a7a0: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
a7b0: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
a7c0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
a7d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
a7e0: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
a7f0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
a800: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
a810: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
a820: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
a830: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
a840: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
a850: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
a860: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
a870: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
a880: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
a890: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
a8a0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
a8b0: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
a8c0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
a8d0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
a8e0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
a8f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
a900: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
a910: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
a920: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
a930: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
a940: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
a950: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
a960: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
a970: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
a980: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
a990: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
a9a0: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
a9b0: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
a9c0: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
a9d0: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
a9e0: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
a9f0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
aa00: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
aa10: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
aa20: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
aa30: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
aa40: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
aa50: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
aa60: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
aa70: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
aa80: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
aa90: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
aaa0: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
aab0: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
aac0: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
aad0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
aae0: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
aaf0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
ab00: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
ab10: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
ab20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
ab30: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
ab40: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
ab50: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
ab60: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
ab70: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
ab80: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
ab90: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
aba0: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
abb0: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
abc0: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
abd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
abe0: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
abf0: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
ac00: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
ac10: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
ac20: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
ac30: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
ac40: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
ac50: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
ac60: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
ac70: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
ac80: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
ac90: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
aca0: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
acb0: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
acc0: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
acd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ace0: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
acf0: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
ad00: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
ad10: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
ad20: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
ad30: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
ad40: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
ad50: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
ad60: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
ad70: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
ad80: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
ad90: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
ada0: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
adb0: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
adc0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
add0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
ade0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
adf0: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
ae00: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
ae10: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
ae20: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
ae30: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
ae40: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
ae50: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
ae60: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
ae70: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
ae80: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
ae90: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
aea0: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
aeb0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
aec0: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
aed0: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
aee0: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
aef0: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
af00: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
af10: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
af20: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
af30: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
af40: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
af50: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
af60: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
af70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
af80: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
af90: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
afa0: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
afb0: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
afc0: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
afd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
afe0: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
aff0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
b000: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
b010: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
b020: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
b030: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
b040: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
b050: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
b060: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
b070: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
b080: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
b090: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
b0a0: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
b0b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
b0c0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
b0d0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
b0e0: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
b0f0: 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  ger){.  i64 szJ;
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
b120: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
b130: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
b140: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
b150: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b160: 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
b170: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
b180: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
b190: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b1a0: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
b1b0: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
b1c0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
b1d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
b1e0: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
b1f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
b200: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
b210: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
b220: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
b230: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
b240: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
b250: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
b260: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
b270: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
b280: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
b290: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
b2a0: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
b2b0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
b2c0: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
b2d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
b2e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
b2f0: 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
b300: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
b310: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
b320: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b330: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
b340: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
b350: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
b360: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b370: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
b380: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
b390: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
b3a0: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
b3b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
b3c0: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
b3d0: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
b3e0: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
b3f0: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
b400: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
b410: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
b420: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
b430: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
b440: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
b450: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
b460: 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29  ->jfd, &zMaster)
b470: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
b480: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
b490: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b4a0: 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26  OK || (zMaster &
b4b0: 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  & !sqlite3OsFile
b4c0: 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29  Exists(zMaster))
b4d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
b4e0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
b4f0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
b500: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b510: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
b520: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
b530: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
b540: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
b550: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
b560: 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  0);.  pPager->jo
b570: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
b580: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
b590: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
b5a0: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
b5b0: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
b5c0: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
b5d0: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
b5e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
b5f0: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
b600: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
b610: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
b620: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
b630: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
b640: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
b650: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
b660: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
b670: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
b680: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
b690: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
b6a0: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
b6b0: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
b6c0: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
b6d0: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
b6e0: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
b6f0: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
b700: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
b710: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
b720: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
b730: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
b740: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
b750: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
b760: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
b770: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b780: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
b790: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
b7a0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
b7b0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b7c0: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
b7d0: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
b7e0: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
b7f0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
b800: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
b810: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
b820: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
b830: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
b840: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
b850: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
b860: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
b870: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
b880: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
b890: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
b8a0: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
b8b0: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
b8c0: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
b8d0: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
b8e0: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
b8f0: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
b900: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
b910: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
b920: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
b930: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
b940: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
b950: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
b960: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
b970: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
b980: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
b990: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
b9a0: 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
b9b0: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
b9c0: 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
b9d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
b9e0: 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69  ck to it's origi
b9f0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
ba00: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
ba10: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
ba20: 43 4c 55 53 49 56 45 20 26 26 20 0a 20 20 20 20  CLUSIVE && .    
ba30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
ba40: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
ba50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
ba60: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ba70: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
ba80: 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ze==0 || pPager-
ba90: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50  >origDbSize==mxP
baa0: 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g );.      rc = 
bab0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
bac0: 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
bad0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bae0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
baf0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
bb00: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
bb10: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
bb20: 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
bb30: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
bb40: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
bb50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
bb60: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
bb70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
bb80: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
bb90: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
bba0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
bbb0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
bbc0: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
bbd0: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
bbe0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bbf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
bc00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
bc10: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
bc20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bc30: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
bc40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
bc50: 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
bc60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
bc70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
bc80: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
bc90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bca0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bcb0: 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
bcc0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
bcd0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
bce0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bcf0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
bd00: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
bd10: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
bd20: 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( zMaster ){.   
bd30: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
bd40: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
bd50: 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
bd60: 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74  ne will return t
bd70: 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  rue,.    ** see 
bd80: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
bd90: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
bda0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
bdb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
bdc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bdd0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
bde0: 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74  _delmaster(zMast
bdf0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
be00: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
be10: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  r);.  }..  /* Th
be20: 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
be30: 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
be40: 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
be50: 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
be60: 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
be70: 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
be80: 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
be90: 64 69 66 66 65 72 65 6e 74 20 50 41 47 45 52 5f  different PAGER_
bea0: 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a  SECTOR_SIZE.  **
beb0: 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
bec0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
bed0: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
bee0: 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70  rocess..  */.  p
bef0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
bf00: 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52  e = PAGER_SECTOR
bf10: 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  _SIZE;.  return 
bf20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
bf30: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
bf40: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
bf50: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
bf60: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
bf70: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
bf80: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
bf90: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
bfa0: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
bfb0: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
bfc0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
bfd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bfe0: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
bff0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
c000: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
c010: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
c020: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
c030: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
c040: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
c050: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
c060: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
c070: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
c080: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
c090: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
c0a0: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
c0b0: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
c0c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
c0d0: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
c0e0: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
c0f0: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
c100: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
c110: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
c120: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
c130: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
c140: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
c150: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
c160: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
c170: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
c180: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
c190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c1a0: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
c1b0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c1d0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
c1e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
c1f0: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
c200: 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20  nalOff;.#ifndef 
c210: 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20  NDEBUG .  {.    
c220: 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  i64 os_szJ;.    
c230: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
c240: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
c250: 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
c260: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c270: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c280: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
c290: 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
c2a0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
c2b0: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
c2c0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
c2d0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
c2e0: 61 64 65 72 20 77 72 69 74 74 65 6e 0a 20 20 2a  ader written.  *
c2f0: 2a 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * this statement
c300: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72   transaction, or
c310: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c320: 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e  file if no journ
c330: 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77  al.  ** header w
c340: 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  as written..  */
c350: 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67  .  hdrOff = pPag
c360: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a  er->stmtHdrOff;.
c370: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c380: 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68  ->fullSync || !h
c390: 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21  drOff );.  if( !
c3a0: 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64  hdrOff ){.    hd
c3b0: 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  rOff = szJ;.  }.
c3c0: 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65    .  /* Truncate
c3d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
c3e0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
c3f0: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
c400: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
c410: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
c420: 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  VE ){.    rc = p
c430: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
c440: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
c450: 6d 74 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70  mtSize);.  }.  p
c460: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
c470: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
c480: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
c490: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
c4a0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  rds are in the s
c4b0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c4c0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
c4d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
c4e0: 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  se && pPager->jo
c4f0: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
c500: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
c510: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
c520: 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e   nRec = pPager->
c530: 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f  stmtNRec;.  .  /
c540: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
c550: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
c560: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
c570: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
c580: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
c590: 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74  se file.  Note t
c5a0: 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
c5b0: 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20  t journal omits 
c5c0: 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20  checksums from. 
c5d0: 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20   ** each record 
c5e0: 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c  since power-fail
c5f0: 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20  ure recovery is 
c600: 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  not important to
c610: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
c620: 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
c630: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
c640: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
c650: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
c660: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
c670: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
c680: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
c690: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
c6a0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
c6b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
c6c0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
c6d0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
c6e0: 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
c6f0: 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
c700: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
c710: 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
c720: 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
c730: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c740: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c750: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
c760: 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
c770: 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
c780: 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
c790: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
c7a0: 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
c7b0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
c7c0: 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
c7d0: 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
c7e0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
c7f0: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
c800: 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
c810: 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
c820: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
c830: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
c840: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
c850: 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
c860: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
c870: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
c880: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
c890: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
c8a0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
c8b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c8c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
c8d0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
c8e0: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
c8f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c900: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
c910: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
c920: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
c930: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61  ->stmtCksum;.  a
c940: 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48  ssert( JOURNAL_H
c950: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28 70  DR_SZ(pPager)<(p
c960: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
c970: 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  8) );.  while( p
c980: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c990: 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70 50  f <= (hdrOff-(pP
c9a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
c9b0: 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  )) ){.    rc = p
c9c0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
c9d0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
c9e0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
c9f0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
ca00: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
ca10: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ca20: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
ca30: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
ca40: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61   }..  while( pPa
ca50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ca60: 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  < szJ ){.    u32
ca70: 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20   nJRec;         
ca80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
ca90: 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
caa0: 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
cab0: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
cac0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
cad0: 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
cae0: 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  my);.    if( rc!
caf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cb00: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
cb10: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
cb20: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74       goto end_st
cb30: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
cb40: 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63   }.    if( nJRec
cb50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52  ==0 ){.      nJR
cb60: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
cb70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
cb80: 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  / (pPager->pageS
cb90: 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20  ize+8);.    }.  
cba0: 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b    for(i=nJRec-1;
cbb0: 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
cbc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
cbd0: 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
cbe0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
cbf0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
cc00: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
cc10: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
cc20: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
cc30: 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
cc40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
cc50: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
cc60: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
cc70: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
cc80: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
cc90: 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
cca0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
ccb0: 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20  QLITE_OK) {.    
ccc0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ccd0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a  ff = szJ;.    /*
cce0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
ccf0: 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  che(pPager); */.
cd00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cd10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
cd20: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
cd30: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
cd40: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
cd50: 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
cd60: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
cd70: 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65  t_cachesize(Page
cd80: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
cd90: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
cda0: 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
cdb0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
cdc0: 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  mxPage;.  }else{
cdd0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
cde0: 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  age = 10;.  }.}.
cdf0: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
ce00: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
ce10: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
ce20: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
ce30: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
ce40: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
ce50: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
ce60: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
ce70: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
ce80: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
ce90: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
cea0: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
ceb0: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
cec0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
ced0: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
cee0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
cef0: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
cf00: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
cf10: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
cf20: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
cf30: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
cf40: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
cf50: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
cf60: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
cf70: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
cf80: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
cf90: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
cfa0: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
cfb0: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
cfc0: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
cfd0: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
cfe0: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
cff0: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
d010: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
d020: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
d030: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
d040: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
d050: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
d060: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
d070: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
d080: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
d090: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
d0a0: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
d0b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
d0c0: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
d0d0: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
d0e0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
d0f0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d110: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
d120: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
d130: 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
d140: 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
d150: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
d160: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
d170: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
d180: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
d190: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
d1a0: 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
d1b0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
d1c0: 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
d1d0: 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
d1e0: 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
d1f0: 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
d200: 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
d220: 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
d230: 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
d240: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
d250: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d260: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
d270: 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
d280: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
d290: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
d2a0: 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
d2b0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
d2c0: 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
d2d0: 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
d2e0: 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
d2f0: 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
d300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
d310: 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
d320: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
d330: 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61 67  safety_level(Pag
d340: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d350: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f  level, int full_
d360: 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  fsync){.  pPager
d370: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
d380: 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
d390: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
d3a0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
d3b0: 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
d3c0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
d3d0: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
d3e0: 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b  nc = full_fsync;
d3f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
d400: 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
d410: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
d420: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
d430: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
d440: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
d450: 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
d460: 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
d470: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
d480: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
d490: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
d4a0: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
d4b0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
d4c0: 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
d4d0: 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
d4e0: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
d4f0: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70  t = 0;../*.** Op
d500: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
d510: 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
d520: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
d530: 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a 2a 20 28   into zFile.** (
d540: 7a 46 69 6c 65 20 6d 75 73 74 20 62 65 20 61 74  zFile must be at
d550: 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45   least SQLITE_TE
d560: 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65  MPNAME_SIZE byte
d570: 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a  s long.)  Write.
d580: 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
d590: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
d5a0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
d5b0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
d5c0: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
d5d0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
d5e0: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
d5f0: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
d600: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
d610: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
d620: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
d630: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
d640: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
d650: 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a  _opentemp(char *
d660: 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 2a  zFile, OsFile **
d670: 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  pFd){.  int cnt 
d680: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
d690: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
d6a0: 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
d6b0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
d6c0: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
d6d0: 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 63  y */.  do{.    c
d6e0: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
d6f0: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
d700: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
d710: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
d720: 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70  clusive(zFile, p
d730: 46 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65  Fd, 1);.  }while
d740: 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53  ( cnt>0 && rc!=S
d750: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
d760: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
d770: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d780: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
d790: 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
d7a0: 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
d7b0: 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
d7c0: 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
d7d0: 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
d7e0: 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
d7f0: 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
d800: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
d810: 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
d820: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
d830: 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e  e3pager_get() an
d840: 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f  d is only held o
d850: 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  pen until the.**
d860: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
d870: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
d880: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
d890: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
d8a0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
d8b0: 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
d8c0: 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
d8d0: 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
d8e0: 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
d8f0: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
d900: 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
d910: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
d920: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
d930: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
d940: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
d950: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
d960: 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f  :" then all info
d970: 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
d980: 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20  in cache..** It 
d990: 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
d9a0: 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
d9b0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
d9c0: 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69  mplement an.** i
d9d0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
d9e0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
d9f0: 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50  3pager_open(.  P
da00: 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
da10: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
da20: 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
da30: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
da40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
da50: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
da60: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
da70: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
da80: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
da90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
daa0: 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
dab0: 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
dac0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
dad0: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
dae0: 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
daf0: 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
db00: 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61   file */.){.  Pa
db10: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
db20: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61  .  char *zFullPa
db30: 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  thname = 0;.  in
db40: 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43  t nameLen;  /* C
db50: 6f 6d 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67  ompiler is wrong
db60: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
db70: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66   initialized bef
db80: 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46  ore use */.  OsF
db90: 69 6c 65 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72  ile *fd;.  int r
dba0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
dbb0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65   int i;.  int te
dbc0: 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  mpFile = 0;.  in
dbd0: 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69  t memDb = 0;.  i
dbe0: 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
dbf0: 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
dc00: 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
dc10: 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
dc20: 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61  ==0;.  int noRea
dc30: 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
dc40: 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
dc50: 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a  CK)!=0;.  char z
dc60: 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
dc70: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64  NAME_SIZE];.#ifd
dc80: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
dc90: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
dca0: 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  NT.  /* A malloc
dcb0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  () cannot fail i
dcc0: 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  n sqlite3ThreadD
dcd0: 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20  ata() as one or 
dce0: 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20  more calls to . 
dcf0: 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73   ** malloc() mus
dd00: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
dd10: 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73  een made by this
dd20: 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69   thread before i
dd30: 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74  t gets.  ** to t
dd40: 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20  his point. This 
dd50: 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64  means the Thread
dd60: 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62  Data must have b
dd70: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  een allocated al
dd80: 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68  ready.  ** so th
dd90: 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
dda0: 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e  lloc can be set.
ddb0: 20 49 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63   It would be nic
ddc0: 65 20 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a  e to assert.  **
ddd0: 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61   that ThreadData
dde0: 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a  .nAlloc is non-z
ddf0: 65 72 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68  ero, but alas th
de00: 69 73 20 62 72 65 61 6b 73 20 74 65 73 74 20 63  is breaks test c
de10: 61 73 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74  ases .  ** writt
de20: 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  en to invoke the
de30: 20 70 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e   pager directly.
de40: 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61  .  */.  ThreadDa
de50: 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74  ta *pTsd = sqlit
de60: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  e3ThreadData();.
de70: 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20 29    assert( pTsd )
de80: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
de90: 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 61  f malloc() has a
dea0: 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20 72 65  lready failed re
deb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
dec0: 4d 2e 20 42 65 66 6f 72 65 20 65 76 65 6e 0a 20  M. Before even. 
ded0: 20 2a 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20   ** testing for 
dee0: 74 68 69 73 2c 20 73 65 74 20 2a 70 70 50 61 67  this, set *ppPag
def0: 65 72 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68  er to NULL so th
df00: 65 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 20 74  e caller knows t
df10: 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 73 74  he pager.  ** st
df20: 72 75 63 74 75 72 65 20 77 61 73 20 6e 65 76 65  ructure was neve
df30: 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 20 20  r allocated. .  
df40: 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
df50: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
df60: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
df70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
df80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
df90: 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20   memset(&fd, 0, 
dfa0: 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20  sizeof(fd));..  
dfb0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
dfc0: 72 20 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a  r file and set z
dfd0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20  FullPathname to 
dfe0: 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28  point at malloc(
dff0: 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  )ed .  ** memory
e000: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e010: 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d  complete filenam
e020: 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e  e (i.e. includin
e030: 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 29  g the directory)
e040: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
e050: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
e060: 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65  ame[0] ){.#ifnde
e070: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
e080: 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
e090: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
e0a0: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
e0b0: 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
e0c0: 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61  1;.      zFullPa
e0d0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  thname = sqliteS
e0e0: 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d  trDup("");.    }
e0f0: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
e100: 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  {.      zFullPat
e110: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
e120: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
e130: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
e140: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
e150: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
e160: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
e170: 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61  eadWrite(zFullPa
e180: 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65  thname, &fd, &re
e190: 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d  adOnly);.      }
e1a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
e1b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e1c0: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
e1d0: 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20  Temp, &fd);.    
e1e0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d  zFilename = zTem
e1f0: 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  p;.    zFullPath
e200: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
e210: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
e220: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
e230: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e240: 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65  {.      tempFile
e250: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
e260: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
e270: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
e280: 72 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74  re. As part of t
e290: 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69  he same allocati
e2a0: 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a  on, allocate.  *
e2b0: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
e2c0: 66 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68  full paths of th
e2d0: 65 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72  e file, director
e2e0: 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20  y and journal . 
e2f0: 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65   ** (Pager.zFile
e300: 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72  name, Pager.zDir
e310: 65 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72  ectory and Pager
e320: 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f  .zJournal)..  */
e330: 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68  .  if( zFullPath
e340: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65  name ){.    name
e350: 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75  Len = strlen(zFu
e360: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e370: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
e380: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
e390: 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65  pPager) + nameLe
e3a0: 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 7d 0a  n*3 + 30 );.  }.
e3b0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
e3c0: 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74  r occured in eit
e3d0: 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
e3e0: 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
e3f0: 65 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70  e memory .  ** p
e400: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75  ointed to by zFu
e410: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65  llPathname, free
e420: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
e430: 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
e440: 68 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53  he .  ** file. S
e450: 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
e460: 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
e470: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
e480: 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
e490: 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
e4a0: 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
e4b0: 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
e4c0: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
e4d0: 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
e4e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
e4f0: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
e500: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
e510: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e520: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
e530: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  r);.    return (
e540: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f  (rc==SQLITE_OK)?
e550: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29  SQLITE_NOMEM:rc)
e560: 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 33 28  ;.  }..  TRACE3(
e570: 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
e580: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
e590: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
e5a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
e5b0: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
e5c0: 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
e5d0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
e5e0: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
e5f0: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
e600: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
e610: 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
e620: 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65  Directory[nameLe
e630: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
e640: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
e650: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
e660: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
e670: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  r->zDirectory, z
e680: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a  FullPathname);..
e690: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
e6a0: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
e6b0: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
e6c0: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
e6d0: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
e6e0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
e6f0: 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70   = 0;.  strcpy(p
e700: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
e710: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e720: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
e730: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e740: 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e  strcpy(&pPager->
e750: 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e  zJournal[nameLen
e760: 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a  ], "-journal");.
e770: 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66    pPager->fd = f
e780: 64 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  d;.  /* pPager->
e790: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
e7a0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   */.  pPager->us
e7b0: 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
e7c0: 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
e7d0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
e7e0: 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
e7f0: 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
e800: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
e810: 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
e820: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
e830: 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
e840: 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
e850: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
e860: 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
e870: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
e880: 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  eSize = SQLITE_D
e890: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
e8a0: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
e8b0: 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
e8c0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
e8d0: 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
e8e0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
e8f0: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
e900: 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20  Pager->nMaxPage 
e910: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
e920: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a  ->mxPage = 100;.
e930: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
e940: 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f  UNLOCK==0 );.  /
e950: 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
e960: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
e970: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
e980: 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
e990: 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
e9a0: 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
e9b0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
e9c0: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
e9d0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
e9e0: 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
e9f0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
ea00: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
ea10: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
ea20: 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
ea30: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
ea40: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
ea50: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
ea60: 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  1);.  /* pPager-
ea70: 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
ea80: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
ea90: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
eaa0: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
eab0: 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
eac0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
ead0: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
eae0: 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61 67 65  nExtra);.  pPage
eaf0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
eb00: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
eb10: 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  E;.  /* pPager->
eb20: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
eb30: 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
eb40: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
eb50: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
eb60: 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
eb70: 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
eb80: 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r;.#ifdef SQLITE
eb90: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
eba0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67  ANAGEMENT.  pPag
ebb0: 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64  er->pNext = pTsd
ebc0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64  ->pPager;.  pTsd
ebd0: 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
ebe0: 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  r;.#endif.  retu
ebf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ec00: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
ec10: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
ec20: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
ec30: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62  lite3pager_set_b
ec40: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
ec50: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
ec60: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
ec70: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
ec80: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
ec90: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
eca0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
ecb0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
ecc0: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
ecd0: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
ece0: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
ecf0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
ed00: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
ed10: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
ed20: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
ed30: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
ed40: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
ed50: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
ed60: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
ed70: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
ed80: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
ed90: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
eda0: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
edb0: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
edc0: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
edd0: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
ede0: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
edf0: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
ee00: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
ee10: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
ee20: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
ee30: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
ee40: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
ee50: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
ee60: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
ee70: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
ee80: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
ee90: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
eea0: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
eeb0: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
eec0: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
eed0: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
eee0: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
eef0: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
ef00: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
ef10: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
ef20: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
ef30: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
ef40: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
ef50: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
ef60: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
ef70: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
ef80: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
ef90: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
efa0: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
efb0: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
efc0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
efd0: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
efe0: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
eff0: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
f000: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
f010: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
f020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
f030: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65  e page size.  Re
f040: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a  turn the new siz
f050: 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65  e.  If the sugge
f060: 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73  st new page.** s
f070: 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72  ize is inappropr
f080: 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
f090: 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
f0a0: 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a  ize is selected.
f0b0: 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e  ** and returned.
f0c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
f0d0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a  ager_set_pagesiz
f0e0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
f0f0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
f100: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
f110: 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
f120: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
f130: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69  PAGE_SIZE );.  i
f140: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
f150: 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
f160: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
f170: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Size;.  }.  retu
f180: 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  rn pPager->pageS
f190: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
f1a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
f1b0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
f1c0: 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
f1d0: 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
f1e0: 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
f1f0: 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
f200: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
f210: 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
f220: 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
f230: 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
f240: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
f250: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
f260: 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
f270: 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
f280: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
f290: 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
f2a0: 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
f2b0: 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
f2c0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
f2d0: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
f2e0: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
f2f0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
f300: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
f310: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
f320: 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65  ed_cnt;.void cle
f330: 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  ar_simulated_io_
f340: 65 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74  error(){.  sqlit
f350: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20  e3_io_error_hit 
f360: 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61  = 0;.}.void disa
f370: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
f380: 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
f390: 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
f3a0: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
f3b0: 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
f3c0: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
f3d0: 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
f3e0: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
f3f0: 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
f400: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
f410: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
f420: 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
f430: 0a 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f  .# define clear_
f440: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
f450: 6f 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69  or().# define di
f460: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
f470: 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
f480: 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
f490: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
f4a0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
f4b0: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
f4c0: 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
f4d0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
f4e0: 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
f4f0: 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
f500: 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
f510: 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
f520: 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
f530: 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
f540: 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
f550: 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
f560: 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
f570: 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
f580: 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
f590: 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
f5a0: 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
f5b0: 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
f5c0: 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
f5d0: 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
f5e0: 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
f5f0: 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
f600: 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
f610: 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
f620: 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
f630: 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
f640: 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
f650: 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
f660: 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
f670: 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
f680: 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  s)..*/.void sqli
f690: 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69  te3pager_read_fi
f6a0: 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
f6b0: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
f6c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
f6d0: 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  est){.  memset(p
f6e0: 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
f6f0: 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
f700: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
f710: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
f720: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
f730: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
f740: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  0);.    sqlite3O
f750: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
f760: 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20  , pDest, N);.   
f770: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
f780: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
f790: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
f7a0: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
f7b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
f7c0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
f7d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
f7e0: 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   pPager. .**.** 
f7f0: 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42  If the PENDING_B
f800: 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20  YTE lies on the 
f810: 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66  page directly af
f820: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
f830: 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  he.** file, then
f840: 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70   consider this p
f850: 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  age part of the 
f860: 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78  file too. For ex
f870: 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e  ample, if.** PEN
f880: 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74  DING_BYTE is byt
f890: 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73  e 4096 (the firs
f8a0: 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35  t byte of page 5
f8b0: 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  ) and the size o
f8c0: 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  f the.** file is
f8d0: 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69   4096 bytes, 5 i
f8e0: 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
f8f0: 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20  ad of 4..*/.int 
f900: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
f910: 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
f920: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
f930: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f940: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
f950: 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
f960: 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
f970: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
f980: 73 65 20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  se {.    if( sql
f990: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
f9a0: 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d  Pager->fd, &n)!=
f9b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f9c0: 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
f9d0: 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 49 4f  Pager, SQLITE_IO
f9e0: 45 52 52 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ERR);.      retu
f9f0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
fa00: 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
fa10: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
fa20: 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  .      n = 1;.  
fa30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
fa40: 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
fa50: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
fa60: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
fa70: 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
fa80: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
fa90: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  >dbSize = n;.   
faa0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
fab0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  (PENDING_BYTE/pP
fac0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
fad0: 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
fae0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
faf0: 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
fb00: 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
fb10: 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
fb20: 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a  al(Pager*);.../*
fb30: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66  .** Unlink pPg f
fb40: 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
fb50: 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
fb60: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
fb70: 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
fb80: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
fb90: 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
fba0: 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
fbb0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
fbc0: 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
fbd0: 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
fbe0: 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63  page() routine c
fbf0: 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20  an leave a page 
fc00: 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74  in the .** pNext
fc10: 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c  Free/pPrevFree l
fc20: 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ist that is not 
fc30: 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  a part of any ha
fc40: 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  sh-chain..*/.sta
fc50: 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48  tic void unlinkH
fc60: 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a  ashChain(Pager *
fc70: 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
fc80: 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
fc90: 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pgno==0 ){.    /
fca0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
fcb0: 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68  mber is zero, th
fcc0: 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
fcd0: 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68 20  not in any hash 
fce0: 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65  chain. */.    re
fcf0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
fd00: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
fd10: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
fd20: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
fd30: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
fd40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
fd50: 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
fd60: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
fd70: 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61  ->aHash[pager_ha
fd80: 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d  sh(pPg->pgno)]!=
fd90: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
fda0: 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
fdb0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
fdc0: 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
fdd0: 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65      int h = page
fde0: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
fdf0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
fe00: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
fe10: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
fe20: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
fe30: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
fe40: 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   }..  pPg->pgno 
fe50: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78  = 0;.  pPg->pNex
fe60: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  tHash = pPg->pPr
fe70: 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f  evHash = 0;.}../
fe80: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61  *.** Unlink a pa
fe90: 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
fea0: 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
feb0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65  of all pages whe
fec0: 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61  re nRef==0).** a
fed0: 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  nd from its hash
fee0: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
fef0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ff00: 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64   unlinkPage(PgHd
ff10: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
ff20: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
ff30: 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65  pPager;..  /* Ke
ff40: 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e  ep the pFirstSyn
ff50: 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ced pointer poin
ff60: 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73  ting at the firs
ff70: 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70  t synchronized p
ff80: 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  age */.  if( pPg
ff90: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
ffa0: 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67  Synced ){.    Pg
ffb0: 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
ffc0: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69  extFree;.    whi
ffd0: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
ffe0: 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
fff0: 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
10000 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
10010 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
10020 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
10030 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
10040 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
10050 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
10060 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
10070 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
10080 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  xtFree;.  }else{
10090 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
100a0 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67  ger->pFirst==pPg
100b0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
100c0 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
100d0 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69  extFree;.  }.  i
100e0 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
100f0 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  e ){.    pPg->pN
10100 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
10110 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
10120 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
10130 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10140 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
10150 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
10160 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
10170 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ee;.  }.  pPg->p
10180 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
10190 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a  pPrevFree = 0;..
101a0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
101b0 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
101c0 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  able */.  unlink
101d0 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
101e0 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64  , pPg);.}..#ifnd
101f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
10200 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68  EMORYDB./*.** Th
10210 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
10220 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ed to truncate a
10230 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
10240 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a  base.  Delete.**
10250 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65   all pages whose
10260 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20   pgno is larger 
10270 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
10280 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66  ize and is unref
10290 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65  erenced..** Refe
102a0 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72  renced pages lar
102b0 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
102c0 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f  >dbSize are zero
102d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
102e0 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74  id memoryTruncat
102f0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
10300 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
10310 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a    PgHdr **ppPg;.
10320 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70    int dbSize = p
10330 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
10340 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72    ppPg = &pPager
10350 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28  ->pAll;.  while(
10360 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d   (pPg = *ppPg)!=
10370 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  0 ){.    if( pPg
10380 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29  ->pgno<=dbSize )
10390 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  {.      ppPg = &
103a0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
103b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67     }else if( pPg
103c0 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
103d0 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
103e0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
103f0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10400 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  );.      ppPg = 
10410 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
10420 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10430 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e   *ppPg = pPg->pN
10440 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e  extAll;.      un
10450 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
10460 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
10470 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pPg);.      pPag
10480 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20  er->nPage--;.   
10490 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
104a0 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75  define memoryTru
104b0 6e 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66 0a  ncate(p).#endif.
104c0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
104d0 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  tain a lock on a
104e0 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74   file.  Invoke t
104f0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
10500 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20   if the lock.** 
10510 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
10520 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70   available.  Rep
10530 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75  eat until the bu
10540 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
10550 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20  rns.** false or 
10560 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73  until the lock s
10570 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
10580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
10590 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
105a0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
105b0 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
105c0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f  .** the lock..*/
105d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
105e0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
105f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
10600 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
10610 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
10620 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
10630 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
10640 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
10650 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
10660 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
10670 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
10680 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
10690 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  CK );.  if( pPag
106a0 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74  er->state>=lockt
106b0 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ype ){.    rc = 
106c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
106d0 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
106e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
106f0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
10700 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
10710 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
10720 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69  ITE_BUSY && sqli
10730 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
10740 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
10750 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20  syHandler) );.  
10760 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
10780 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63  ger->state = loc
10790 6b 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  ktype;.    }.  }
107a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
107b0 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
107c0 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  the file to the 
107d0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
107e0 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e  specified..*/.in
107f0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74  t sqlite3pager_t
10800 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
10810 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
10820 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
10830 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
10840 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
10850 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
10860 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  rCode ){.    rc 
10870 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
10880 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  e;.    return rc
10890 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
108a0 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61  e>=(unsigned)pPa
108b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
108c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
108d0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d  _OK;.  }.  if( M
108e0 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
108f0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
10900 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72  ge;.    memoryTr
10910 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
10920 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10930 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
10940 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
10950 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
10960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10970 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10980 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63  .  /* Get an exc
10990 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
109a0 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
109b0 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a  re truncating. *
109c0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
109d0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
109e0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
109f0 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
10a00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
10a20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
10a30 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50  ncate(pPager, nP
10a40 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
10a50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10a60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
10a70 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72  = nPage;.  }.  r
10a80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10a90 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
10aa0 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
10ab0 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
10ac0 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
10ad0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
10ae0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
10af0 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
10b00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10b10 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
10b20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
10b30 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
10b40 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
10b50 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
10b60 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
10b70 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
10b80 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
10b90 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
10ba0 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
10bb0 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
10bc0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
10bd0 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
10be0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
10bf0 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
10c00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10c10 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
10c20 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
10c30 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
10c40 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
10c50 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
10c60 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
10c70 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
10c80 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
10c90 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
10ca0 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
10cb0 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
10cc0 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
10cd0 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
10ce0 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
10cf0 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
10d00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
10d10 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
10d20 70 4e 65 78 74 3b 0a 23 69 66 64 65 66 20 53 51  pNext;.#ifdef SQ
10d30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
10d40 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
10d50 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61  /* A malloc() ca
10d60 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c  nnot fail in sql
10d70 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
10d80 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   as one or more 
10d90 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d  calls to .  ** m
10da0 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76  alloc() must hav
10db0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d  e already been m
10dc0 61 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65  ade by this thre
10dd0 61 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74  ad before it get
10de0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70  s.  ** to this p
10df0 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73  oint. This means
10e00 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20   the ThreadData 
10e10 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61  must have been a
10e20 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79  llocated already
10e30 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68  .  ** so that Th
10e40 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20  readData.nAlloc 
10e50 63 61 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  can be set..  */
10e60 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70  .  ThreadData *p
10e70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72  Tsd = sqlite3Thr
10e80 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73  eadData();.  ass
10e90 65 72 74 28 20 70 50 61 67 65 72 20 29 3b 0a 20  ert( pPager );. 
10ea0 20 61 73 73 65 72 74 28 20 70 54 73 64 20 26 26   assert( pTsd &&
10eb0 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b   pTsd->nAlloc );
10ec0 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69 74 63  .#endif..  switc
10ed0 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  h( pPager->state
10ee0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47   ){.    case PAG
10ef0 45 52 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20  ER_RESERVED:.   
10f00 20 63 61 73 65 20 50 41 47 45 52 5f 53 59 4e 43   case PAGER_SYNC
10f10 45 44 3a 20 0a 20 20 20 20 63 61 73 65 20 50 41  ED: .    case PA
10f20 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b  GER_EXCLUSIVE: {
10f30 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 69 67 6e  .      /* We ign
10f40 6f 72 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72  ore any IO error
10f50 73 20 74 68 61 74 20 6f 63 63 75 72 20 64 75 72  s that occur dur
10f60 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
10f70 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .      ** operat
10f80 69 6f 6e 2e 20 53 6f 20 64 69 73 61 62 6c 65 20  ion. So disable 
10f90 49 4f 20 65 72 72 6f 72 20 73 69 6d 75 6c 61 74  IO error simulat
10fa0 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 65 73 74  ion so that test
10fb0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72  ing.      ** wor
10fc0 6b 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 2e 0a  ks more easily..
10fd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
10fe0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
10ff0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
11000 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
11010 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
11020 29 3b 0a 20 20 20 20 20 20 65 6e 61 62 6c 65 5f  );.      enable_
11030 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
11040 6f 72 73 28 29 3b 0a 20 20 20 20 20 20 69 66 28  ors();.      if(
11050 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
11060 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
11070 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
11080 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
11090 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
110a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
110b0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
110c0 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
110d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
110e0 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 48     case PAGER_SH
110f0 41 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66  ARED: {.      if
11100 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
11110 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
11120 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
11130 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
11140 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11150 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
11160 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
11170 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
11180 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
11190 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  }.  for(pPg=pPag
111a0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
111b0 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64  Pg=pNext){.#ifnd
111c0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66  ef NDEBUG.    if
111d0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
111e0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
111f0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
11200 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
11210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
11220 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
11230 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
11240 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
11250 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
11260 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
11270 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
11280 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
11290 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
112a0 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
112b0 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43  .  }.  TRACE2("C
112c0 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
112d0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
112e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
112f0 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
11300 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
11310 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  =0 && pPager->st
11320 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20  mtOpen==0) );.  
11330 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
11340 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
11350 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
11360 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d  Pager->jfd);.  }
11370 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
11380 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
11390 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
113a0 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
113b0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
113c0 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
113d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
113e0 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64  lose(&pPager->fd
113f0 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
11400 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
11410 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
11420 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
11430 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
11440 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
11450 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
11460 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
11470 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64   ** }.  */..#ifd
11480 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
11490 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
114a0 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  NT.  /* Remove t
114b0 68 65 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68  he pager from th
114c0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
114d0 20 70 61 67 65 72 73 20 73 74 61 72 74 69 6e 67   pagers starting
114e0 20 61 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64   at .  ** Thread
114f0 44 61 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d  Data.pPager if m
11500 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74  emory-management
11510 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a   is enabled..  *
11520 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d  /.  if( pPager==
11530 70 54 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a  pTsd->pPager ){.
11540 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72      pTsd->pPager
11550 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
11560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
11570 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  ager *pTmp;.    
11580 66 6f 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d  for(pTmp = pTsd-
11590 3e 70 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70  >pPager; pTmp->p
115a0 4e 65 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54  Next!=pPager; pT
115b0 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b  mp=pTmp->pNext){
115c0 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78  }.    pTmp->pNex
115d0 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78  t = pPager->pNex
115e0 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  t;.  }.#endif.. 
115f0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
11600 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
11610 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11620 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
11630 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
11640 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61   given page data
11650 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
11660 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65  3pager_pagenumbe
11670 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  r(void *pData){.
11680 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54    PgHdr *p = DAT
11690 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
116a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  );.  return p->p
116b0 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
116c0 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e  e page_ref() fun
116d0 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73  ction increments
116e0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
116f0 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
11700 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
11710 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
11720 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68  the freelist (th
11730 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
11740 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a  t is zero) then.
11750 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  ** remove it fro
11760 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  m the freelist..
11770 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65  **.** For non-te
11780 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
11790 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63 72  _ref() is a macr
117a0 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61  o that calls _pa
117b0 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69  ge_ref().** onli
117c0 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ne of the refere
117d0 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
117e0 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79 73  o.  For test sys
117f0 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
11800 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75  .** is a real fu
11810 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77  nction so that w
11820 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70  e can set breakp
11830 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20  oints and trace 
11840 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
11850 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48  id _page_ref(PgH
11860 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
11870 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
11880 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
11890 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
118a0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
118b0 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20  emove it. */.   
118c0 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70   if( pPg==pPg->p
118d0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
118e0 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48  ced ){.      PgH
118f0 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
11900 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68  xtFree;.      wh
11910 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
11920 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
11930 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
11940 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
11950 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
11960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11970 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
11980 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
11990 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
119a0 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
119b0 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ee;.    }else{. 
119c0 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
119d0 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
119e0 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d  pNextFree;.    }
119f0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
11a00 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20  extFree ){.     
11a10 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
11a20 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
11a30 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
11a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
11a50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  g->pPager->pLast
11a60 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
11a70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  e;.    }.    pPg
11a80 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b  ->pPager->nRef++
11a90 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65  ;.  }.  pPg->nRe
11aa0 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f++;.  REFINFO(p
11ab0 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  Pg);.}.#ifdef SQ
11ac0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61  LITE_DEBUG.  sta
11ad0 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
11ae0 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
11af0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
11b00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61  ==0 ){.      _pa
11b10 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20  ge_ref(pPg);.   
11b20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
11b30 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  g->nRef++;.     
11b40 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20   REFINFO(pPg);. 
11b50 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23     }.  }.#else.#
11b60 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66   define page_ref
11b70 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66  (P)   ((P)->nRef
11b80 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29  ==0?_page_ref(P)
11b90 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66  :(void)(P)->nRef
11ba0 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ++).#endif../*.*
11bb0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
11bc0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
11bd0 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65  for a page.  The
11be0 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69   input pointer i
11bf0 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
11c00 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   to the page dat
11c10 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  a..*/.int sqlite
11c20 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20  3pager_ref(void 
11c30 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
11c40 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
11c50 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
11c60 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
11c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11c80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
11c90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
11ca0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
11cb0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
11cc0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
11cd0 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
11ce0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
11cf0 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
11d00 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
11d10 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
11d20 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  .  It is not saf
11d30 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
11d40 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
11d50 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74  e file until aft
11d60 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  er.** the journa
11d70 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  l has been synce
11d80 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69  d.  If the origi
11d90 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  nal database is 
11da0 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a  modified before.
11db0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
11dc0 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70  s synced and a p
11dd0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
11de0 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65  urs, the unsynce
11df0 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74  d journal.** dat
11e00 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20  a would be lost 
11e10 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20  and we would be 
11e20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65  unable to comple
11e30 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68  tely rollback th
11e40 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
11e50 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65  anges.  Database
11e60 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c   corruption woul
11e70 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20  d occur..** .** 
11e80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
11e90 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52  o updates the nR
11ea0 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
11eb0 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
11ec0 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63  urnal..** (See c
11ed0 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  omments on the p
11ee0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
11ef0 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69  routine for addi
11f00 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
11f10 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73  on.).** If the s
11f20 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c  ync mode is FULL
11f30 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c  , two syncs will
11f40 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74   occur.  First t
11f50 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c  he whole journal
11f60 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74  .** is synced, t
11f70 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
11f80 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74  ld is updated, t
11f90 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e  hen a second syn
11fa0 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
11fb0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  For temporary da
11fc0 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e  tabases, we do n
11fd0 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72  ot care if we ar
11fe0 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  e able to rollba
11ff0 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f  ck.** after a po
12000 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20  wer failure, so 
12010 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
12020 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12030 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53  clears the needS
12040 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65  ync field of eve
12050 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20  ry page current 
12060 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72  held in.** memor
12070 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
12080 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
12090 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
120a0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
120b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
120c0 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20  ..  /* Sync the 
120d0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d  journal before m
120e0 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69  odifying the mai
120f0 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  n database.  ** 
12100 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20  (assuming there 
12110 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  is a journal and
12120 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
12130 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20  synced.).  */.  
12140 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
12150 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20  Sync ){.    if( 
12160 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
12170 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
12180 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
12190 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
121a0 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67  /* assert( !pPag
121b0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f  er->noSync ); //
121c0 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65   noSync might be
121d0 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e   set if synchron
121e0 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73  ous.      ** was
121f0 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65   turned off afte
12200 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
12210 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20  n was started.  
12220 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23  Ticket #615 */.#
12230 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
12240 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
12250 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
12260 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e  Pager->nRec coun
12270 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69  ter we are keepi
12280 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20  ng agrees.      
12290 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52    ** with the nR
122a0 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
122b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
122c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
122d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
122e0 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20    i64 jSz;.     
122f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12300 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
12310 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20  ->jfd, &jSz);.  
12320 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
12330 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12340 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
12350 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
12360 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a  =jSz );.      }.
12370 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
12380 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
12390 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
123a0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
123b0 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
123c0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
123d0 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
123e0 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
123f0 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
12400 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
12410 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
12420 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
12430 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
12440 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
12450 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
12460 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
12470 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
12480 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ack. .        */
12490 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
124a0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
124b0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
124c0 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  2("SYNC journal 
124d0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
124e0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
124f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12500 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
12510 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
12520 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
12530 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12540 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
12550 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
12560 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20  pPager->jfd,.   
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
12590 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
125a0 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
125b0 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c));.        if(
125c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
125d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
125e0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
125f0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
12600 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
12610 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12620 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
12630 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
12640 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
12650 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
12660 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
12670 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12680 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32    }.      TRACE2
12690 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
126a0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
126b0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
126c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
126d0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
126e0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
126f0 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ync);.      if( 
12700 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
12710 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  c;.      pPager-
12720 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
12730 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
12740 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
12750 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
12760 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
12770 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
12780 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
12790 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
127a0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
127b0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
127c0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
127d0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
127e0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
127f0 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
12800 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23  ->pFirst;.  }..#
12810 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
12820 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  /* If the Pager.
12830 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
12840 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20   clear then the 
12850 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20  PgHdr.needSync. 
12860 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c   ** flag must al
12870 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20  so be clear for 
12880 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69  all pages.  Veri
12890 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  fy that this.  *
128a0 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74  * invariant is t
128b0 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  rue..  */.  else
128c0 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  {.    for(pPg=pP
128d0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
128e0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
128f0 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ll){.      asser
12900 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
12910 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
12920 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12930 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  >pFirstSynced==p
12940 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b  Pager->pFirst );
12950 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
12960 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12970 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20  ** Given a list 
12980 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63  of pages (connec
12990 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72  ted by the PgHdr
129a0 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29  .pDirty pointer)
129b0 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20   write.** every 
129c0 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
129d0 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  es out to the da
129e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
129f0 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a  mark them all.**
12a00 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74   as clean..*/.st
12a10 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
12a20 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67  rite_pagelist(Pg
12a30 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50  Hdr *pList){.  P
12a40 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
12a50 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
12a60 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
12a70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
12a80 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50  ager = pList->pP
12a90 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  ager;..  /* At t
12aa0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
12ab0 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
12ac0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
12ad0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
12ae0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
12af0 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
12b00 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
12b10 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
12b20 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
12b30 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
12b40 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d  OsLock() are no-
12b50 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ops..  **.  ** M
12b60 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66  oving the lock f
12b70 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20  rom RESERVED to 
12b80 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c  EXCLUSIVE actual
12b90 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e  ly involves goin
12ba0 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  g.  ** through a
12bb0 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  n intermediate s
12bc0 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20  tate PENDING.   
12bd0 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70  A PENDING lock p
12be0 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a  revents new.  **
12bf0 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74   readers from at
12c00 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64  taching to the d
12c10 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75  atabase but is u
12c20 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20  nsufficient for 
12c30 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65  us to.  ** write
12c40 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61  .  The idea of a
12c50 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
12c60 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20   to prevent new 
12c70 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a  readers from.  *
12c80 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c  * coming in whil
12c90 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78  e we wait for ex
12ca0 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74  isting readers t
12cb0 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20  o clear..  **.  
12cc0 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  ** While the pag
12cd0 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53  er is in the RES
12ce0 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
12cf0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
12d00 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  se file.  ** is 
12d10 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65  unchanged and we
12d20 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69   can rollback wi
12d30 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
12d40 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a  playback the.  *
12d50 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  * journal into t
12d60 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
12d70 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65  base file.  Once
12d80 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74   we transition t
12d90 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45  o.  ** EXCLUSIVE
12da0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64  , it means the d
12db0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
12dc0 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e   been changed an
12dd0 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20  d any rollback. 
12de0 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65   ** will require
12df0 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62   a journal playb
12e00 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
12e10 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
12e20 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
12e30 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69  USIVE_LOCK);.  i
12e40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12e50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
12e60 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  c;.  }..  while(
12e70 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73   pList ){.    as
12e80 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72  sert( pList->dir
12e90 74 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ty );.    rc = s
12ea0 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
12eb0 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d  ger->fd, (pList-
12ec0 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  >pgno-1)*(i64)pP
12ed0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
12ee0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
12ef0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20  turn rc;.    /* 
12f00 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
12f10 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
12f20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
12f30 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
12f40 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
12f50 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
12f60 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
12f70 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
12f80 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
12f90 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
12fa0 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
12fb0 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
12fc0 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
12fd0 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
12fe0 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
12ff0 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
13000 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
13010 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  ist->pgno<=pPage
13020 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
13030 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d     char *pData =
13040 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
13050 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
13060 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
13070 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54 52 41  o, 6);.      TRA
13080 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE3("STORE %d pa
13090 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
130a0 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
130b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72  ->pgno);.      r
130c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
130d0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
130e0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
130f0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 54  geSize);.      T
13100 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
13110 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a  >nWrite);.    }.
13120 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
13130 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54     else{.      T
13140 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
13150 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
13160 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
13170 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
13180 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
13190 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
131a0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72  ;.    pList->dir
131b0 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ty = 0;.#ifdef S
131c0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
131d0 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
131e0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
131f0 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
13200 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
13210 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
13220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
13230 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13240 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
13250 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
13260 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
13270 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
13280 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
13290 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
132a0 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
132b0 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
132c0 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
132d0 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
132e0 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
132f0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
13300 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
13310 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c  er){.  PgHdr *p,
13320 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
13330 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50   = 0;.  for(p=pP
13340 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
13350 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
13360 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20     if( p->dirty 
13370 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72  ){.      p->pDir
13380 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ty = pList;.    
13390 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20    pList = p;.   
133a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
133b0 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
133c0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
133d0 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
133e0 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76  urnal on the giv
133f0 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68  en pager..** A h
13400 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
13410 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
13420 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  be played back..
13430 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
13440 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
13450 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
13460 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
13470 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
13480 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
13490 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
134a0 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
134b0 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
134c0 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
134d0 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64  me name.  Just d
134e0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
134f0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
13500 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
13510 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
13520 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73   if( !pPager->us
13530 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72  eJournal ) retur
13540 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
13550 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
13560 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
13570 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
13580 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65  if( sqlite3OsChe
13590 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
135a0 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74  Pager->fd) ) ret
135b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
135c0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
135d0 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29  unt(pPager)==0 )
135e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  {.    sqlite3OsD
135f0 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
13600 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74  ournal);.    ret
13610 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
13620 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
13630 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
13640 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
13650 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
13660 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e  can be recycled.
13670 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
13680 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20  tine may return 
13690 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
136a0 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c  LITE_FULL or SQL
136b0 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64  ITE_OK. It .** d
136c0 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20  oes not set the 
136d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
136e0 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
136f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65  tic int pager_re
13700 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61  cycle(Pager *pPa
13710 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c  ger, int syncOk,
13720 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a   PgHdr **ppPg){.
13730 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
13740 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a  *ppPg = 0;..  /*
13750 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   Find a page to 
13760 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f  recycle.  Try to
13770 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74   locate a page t
13780 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  hat does not.  *
13790 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
137a0 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
137b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
137c0 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65  */.  pPg = pPage
137d0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r->pFirstSynced;
137e0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75  ..  /* If we cou
137f0 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61  ld not find a pa
13800 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
13810 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e   require an fsyn
13820 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  c().  ** on the 
13830 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
13840 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
13850 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
13860 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73  is a.  ** very s
13870 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  low operation, s
13880 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74  o we work hard t
13890 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74  o avoid it.  But
138a0 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20   sometimes.  ** 
138b0 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70  it can't be help
138c0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
138d0 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  Pg==0 && pPager-
138e0 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f  >pFirst && syncO
138f0 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20  k && !MEMDB){.  
13900 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a    int rc = syncJ
13910 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
13920 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
13930 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
13940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13950 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
13960 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
13970 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
13980 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a  e, write a new j
13990 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
139a0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
139b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
139c0 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76  is is done to av
139d0 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69  oid ever modifyi
139e0 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ng a journal.   
139f0 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61     ** header tha
13a00 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  t is involved in
13a10 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66   the rollback of
13a20 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
13a30 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
13a40 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
13a50 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
13a60 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64  in case the head
13a70 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74  er is.      ** t
13a80 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  rashed when the 
13a90 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
13aa0 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f  dated)..      */
13ab0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
13ac0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  Rec = 0;.      a
13ad0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13ae0 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b  ournalOff > 0 );
13af0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
13b00 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
13b10 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
13b20 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
13b30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13b40 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
13b50 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
13b60 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  t;.  }.  if( pPg
13b70 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
13b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13b90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
13ba0 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
13bb0 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
13bc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13bd0 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64   file if it is d
13be0 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  irty..  */.  if(
13bf0 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20   pPg->dirty ){. 
13c00 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61     int rc;.    a
13c10 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
13c20 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Sync==0 );.    p
13c30 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
13c40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
13c50 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
13c60 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Pg );.    if( rc
13c70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13c80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13c90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
13ca0 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
13cb0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
13cc0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
13cd0 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
13ce0 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
13cf0 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73  ack, then.  ** s
13d00 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
13d10 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
13d20 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
13d30 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  g the.  ** sqlit
13d40 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e_dont_rollback(
13d50 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  ) optimization f
13d60 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  or the rest of t
13d70 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
13d80 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65  .  ** It is nece
13d90 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73  ssary to do this
13da0 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
13db0 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  e marked alwaysR
13dc0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67  ollback.  ** mig
13dd0 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61  ht be reloaded a
13de0 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62  t a later time b
13df0 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ut at that point
13e00 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62   we won't rememb
13e10 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  er.  ** that is 
13e20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  was marked alway
13e30 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73  sRollback.  This
13e40 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20   means that all 
13e50 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  pages must.  ** 
13e60 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  be marked as alw
13e70 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  aysRollback from
13e80 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20   here on out..  
13e90 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  */.  if( pPg->al
13ea0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
13eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61      pPager->alwa
13ec0 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
13ed0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
13ee0 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72   the old page fr
13ef0 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
13f00 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61   and the hash ta
13f10 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e  ble.  */.  unlin
13f20 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 54 45  kPage(pPg);.  TE
13f30 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
13f40 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67  nOvfl);..  *ppPg
13f50 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
13f60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13f70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13f80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
13f90 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73  free superfluous
13fa0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
13fb0 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  ocated memory.**
13fc0 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61 67   held by the pag
13fd0 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72  er system. Memor
13fe0 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20  y in use by any 
13ff0 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c  SQLite pager all
14000 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
14010 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
14020 6d 61 79 20 62 65 20 73 71 6c 69 74 65 46 72 65  may be sqliteFre
14030 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65  e()ed..**.** nRe
14040 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  q is the number 
14050 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  of bytes of memo
14060 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63  ry required. Onc
14070 65 20 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a  e this much has.
14080 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ** been released
14090 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  , the function r
140a0 65 74 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69  eturns. A negati
140b0 76 65 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65  ve value for nRe
140c0 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20  q means.** free 
140d0 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
140e0 73 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20  s possible. The 
140f0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
14100 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
14110 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66   .** of bytes of
14120 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64   memory released
14130 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
14140 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
14150 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20  _MANAGEMENT.int 
14160 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 6c  sqlite3pager_rel
14170 65 61 73 65 5f 6d 65 6d 6f 72 79 28 69 6e 74 20  ease_memory(int 
14180 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54  nReq){.  const T
14190 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 72  hreadData *pTsdr
141a0 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  o = sqlite3Threa
141b0 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b  dDataReadOnly();
141c0 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a 20 20 69  .  Pager *p;.  i
141d0 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30  nt nReleased = 0
141e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
141f0 20 49 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62   If the the glob
14200 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  al mutex is held
14210 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
14220 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a  e becomes a.  **
14230 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65   o-op; zero byte
14240 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20  s of memory are 
14250 66 72 65 65 64 2e 20 20 54 68 69 73 20 69 73 20  freed.  This is 
14260 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d  because.  ** som
14270 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e  e of the code in
14280 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66 75  voked by this fu
14290 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a  nction may also.
142a0 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61    ** try to obta
142b0 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65  in the mutex, re
142c0 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61  sulting in a dea
142d0 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  dlock..  */.  if
142e0 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74  ( sqlite3OsInMut
142f0 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74  ex(0) ){.    ret
14300 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
14310 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20   Outermost loop 
14320 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74  runs for at most
14330 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e   two iterations.
14340 20 46 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   First iteration
14350 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20   we.  ** try to 
14360 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74  find memory that
14370 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
14380 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67   without calling
14390 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64   fsync(). Second
143a0 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20  .  ** iteration 
143b0 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73  (which only runs
143c0 20 69 66 20 74 68 65 20 66 69 72 73 74 20 66 61   if the first fa
143d0 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65  iled to free nRe
143e0 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20  q bytes of.  ** 
143f0 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69  memory) is permi
14400 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79  tted to call fsy
14410 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66  nc(). This is of
14420 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72   course much mor
14430 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76  e .  ** expensiv
14440 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
14450 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a  0; i<=1; i++){..
14460 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
14470 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69  ugh all the SQLi
14480 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64  te pagers opened
14490 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
144a0 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 66  thread. */.    f
144b0 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e 70 50 61  or(p=pTsdro->pPa
144c0 67 65 72 3b 20 70 20 26 26 20 28 6e 52 65 71 3c  ger; p && (nReq<
144d0 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e  0 || nReleased<n
144e0 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  Req); p=p->pNext
144f0 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
14500 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  pPg;.      int r
14510 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72  c;..      /* For
14520 20 65 61 63 68 20 70 61 67 65 72 2c 20 74 72 79   each pager, try
14530 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79   to free as many
14540 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69 62   pages as possib
14550 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20  le (without .   
14560 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73     ** calling fs
14570 79 6e 63 28 29 20 69 66 20 74 68 69 73 20 69 73  ync() if this is
14580 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
14590 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65  tion of the oute
145a0 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rmost .      ** 
145b0 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  loop)..      */.
145c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c        while( SQL
145d0 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61  ITE_OK==(rc = pa
145e0 67 65 72 5f 72 65 63 79 63 6c 65 28 70 2c 20 69  ger_recycle(p, i
145f0 2c 20 26 70 50 67 29 29 20 26 26 20 70 50 67 29  , &pPg)) && pPg)
14600 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65   {.        /* We
14610 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65  've found a page
14620 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69   to free. At thi
14630 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65  s point the page
14640 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20   has been .     
14650 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72     ** removed fr
14660 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61 73 68  om the page hash
14670 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73  -table, free-lis
14680 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73  t and synced-lis
14690 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70  t .        ** (p
146a0 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74  FirstSynced). It
146b0 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65   is still in the
146c0 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c   all pages (pAll
146d0 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  ) list. .       
146e0 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72   ** Remove it fr
146f0 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65 66  om this list bef
14700 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20  ore freeing..   
14710 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
14720 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74  ** Todo: Check t
14730 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c  he Pager.pStmt l
14740 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ist to make sure
14750 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20   this is Ok. It 
14760 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
14770 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a  ably is though..
14780 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14790 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a     PgHdr *pTmp;.
147a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
147b0 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70  pPg );.        p
147c0 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
147d0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
147e0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d          if( pPg=
147f0 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  =p->pAll ){.    
14800 20 20 20 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d         p->pAll =
14810 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
14820 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14830 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 70 54           for( pT
14840 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70  mp=p->pAll; pTmp
14850 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b  ->pNextAll!=pPg;
14860 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78   pTmp=pTmp->pNex
14870 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20  tAll ){}.       
14880 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c     pTmp->pNextAl
14890 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
148a0 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
148b0 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b       nReleased +
148c0 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a  = sqliteAllocSiz
148d0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
148e0 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
148f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14910 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
14920 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  An error occured
14930 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
14940 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14950 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 20  file or .       
14960 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70   ** journal in p
14970 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20  ager_recycle(). 
14980 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74  The error is not
14990 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
149a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c   .        ** cal
149b0 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ler of this func
149c0 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73  tion. Instead, s
149d0 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 72 72  et the Pager.err
149e0 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20  Code variable.. 
149f0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72         ** The er
14a00 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
14a10 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
14a20 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74   (or users, in t
14a30 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20 20  he case .       
14a40 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20   ** of a shared 
14a50 70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66 20  pager cache) of 
14a60 74 68 65 20 70 61 67 65 72 20 66 6f 72 20 77 68  the pager for wh
14a70 69 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63  ich the error oc
14a80 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  cured..        *
14a90 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
14aa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
14ab0 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  RR || rc==SQLITE
14ac0 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20  _FULL );.       
14ad0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74   assert( p->stat
14ae0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
14af0 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  D );.        pag
14b00 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63 29 3b  er_error(p, rc);
14b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14b20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65   }..  return nRe
14b30 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66  leased;.}.#endif
14b40 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
14b50 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
14b60 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63  ENT */../*.** Ac
14b70 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
14b80 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
14b90 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
14ba0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
14bb0 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
14bc0 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
14bd0 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
14be0 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
14bf0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
14c00 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
14c10 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66  * A _get works f
14c20 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
14c30 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
14c40 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
14c50 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
14c60 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
14c70 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
14c80 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
14c90 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
14ca0 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
14cb0 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
14cc0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
14cd0 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
14ce0 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
14cf0 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
14d00 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
14d10 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
14d20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
14d30 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
14d40 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
14d50 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
14d60 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
14d70 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
14d80 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
14d90 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
14da0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
14db0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14dc0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
14dd0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
14de0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
14df0 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
14e00 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
14e10 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
14e20 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
14e30 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
14e40 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
14e50 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
14e60 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
14e70 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
14e80 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
14e90 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
14ea0 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
14eb0 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
14ec0 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
14ed0 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
14ee0 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
14ef0 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
14f00 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
14f10 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
14f20 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
14f30 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
14f40 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
14f50 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
14f60 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
14f70 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
14f80 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
14f90 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
14fa0 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
14fb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14fc0 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
14fd0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
14fe0 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
14ff0 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
15000 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
15010 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
15020 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
15030 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
15040 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
15050 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
15060 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
15070 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
15080 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
15090 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
150a0 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
150b0 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
150c0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
150d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
150e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
150f0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  KPT;.  }..  /* M
15100 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
15110 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
15120 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
15130 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
15140 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70  ager!=0 );.  *pp
15150 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
15160 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
15170 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
15180 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
15190 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
151a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
151b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
151c0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
151d0 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
151e0 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
151f0 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
15200 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
15210 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
15220 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45  ->nRef==0 && !ME
15230 4d 44 42 20 29 7b 0a 20 20 20 20 69 66 28 20 21  MDB ){.    if( !
15240 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
15250 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ck ){.      rc =
15260 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
15270 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
15280 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
15290 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
152a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
152b0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
152c0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
152d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
152e0 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
152f0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
15300 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
15310 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
15320 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
15330 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
15340 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
15350 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
15360 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
15370 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48 6f 74  /.    if( hasHot
15380 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20  Journal(pPager) 
15390 29 7b 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74  ){.       /* Get
153a0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
153b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
153c0 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
153d0 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
153e0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
153f0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
15400 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
15410 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
15420 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 2a   to the.       *
15430 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
15440 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e  . If it were, an
15450 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
15460 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20  ght open the.   
15470 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
15480 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
15490 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
154a0 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
154b0 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  t the.       ** 
154c0 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
154d0 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
154e0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
154f0 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20  till rolling it 
15500 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e  .       ** back.
15510 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  .       ** .    
15520 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
15530 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
15540 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
15550 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74  not requested, t
15560 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73 65 63  he.       ** sec
15570 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
15580 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
15590 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
155a0 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
155b0 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73    ** obtain it's
155c0 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
155d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
155e0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
155f0 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
15600 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
15610 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
15620 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
15630 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15650 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
15660 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
15670 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70  OCK);.         p
15680 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
15690 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
156a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
156b0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
156c0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d 0a 20   rc);.       }. 
156d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
156e0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
156f0 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f  USIVE;..       /
15700 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
15710 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  al for reading o
15720 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  nly.  Return SQL
15730 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20  ITE_BUSY if.    
15740 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61     ** we are una
15750 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
15760 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20  journal file. . 
15770 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
15780 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
15790 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ile does not nee
157a0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69  d to be locked i
157b0 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20  tself.  The.    
157c0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
157d0 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e  le is never open
157e0 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e   unless the main
157f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
15800 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61  olds.       ** a
15810 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20   write lock, so 
15820 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
15830 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f  ny chance of two
15840 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20   or more.       
15850 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65  ** processes ope
15860 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ning the journal
15870 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
15880 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e..       */.   
15890 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
158a0 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70  OsOpenReadOnly(p
158b0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
158c0 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a   &pPager->jfd);.
158d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
158e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
158f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
15900 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
15910 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
15920 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
15930 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
15940 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
15950 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
15960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70        }.       p
15970 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
15980 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70  en = 1;.       p
15990 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
159a0 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
159b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
159c0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
159d0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
159e0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  er = 0;.       p
159f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
15a00 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f  r = 0;..       /
15a10 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
15a20 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
15a30 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
15a40 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
15a50 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
15a60 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
15a70 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a  d lock..       *
15a80 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  /.       rc = pa
15a90 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
15aa0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28  ger);.       if(
15ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15ac0 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  {.         retur
15ad0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
15ae0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
15af0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
15b00 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
15b10 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
15b20 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  r page in cache 
15b30 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
15b40 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
15b50 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
15b60 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72   MEMDB && pPager
15b70 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
15b80 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
15b90 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
15ba0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
15bb0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67   }.  }.  if( pPg
15bc0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
15bd0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
15be0 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70   is not in the p
15bf0 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
15c00 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53    int h;.    TES
15c10 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
15c20 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70  Miss);.    if( p
15c30 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61  Pager->nPage<pPa
15c40 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70  ger->mxPage || p
15c50 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30  Pager->pFirst==0
15c60 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20   || MEMDB ){.   
15c70 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
15c80 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ew page */.     
15c90 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
15ca0 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
15cb0 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70  pPg) + pPager->p
15cc0 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20  ageSize.        
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ce0 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75        + sizeof(u
15cf0 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  32) + pPager->nE
15d00 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20  xtra.           
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f     + MEMDB*sizeo
15d30 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a  f(PgHistory) );.
15d40 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
15d50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
15d60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
15d70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
15d80 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69  emset(pPg, 0, si
15d90 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20  zeof(*pPg));.   
15da0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
15db0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
15dc0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
15dd0 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69  , pPager), 0, si
15de0 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29  zeof(PgHistory))
15df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15e00 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
15e10 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d  ager;.      pPg-
15e20 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67  >pNextAll = pPag
15e30 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20  er->pAll;.      
15e40 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70  pPager->pAll = p
15e50 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  Pg;.      pPager
15e60 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
15e70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
15e80 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  ge>pPager->nMaxP
15e90 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  age ){.        a
15ea0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
15eb0 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65 72  MaxPage==(pPager
15ec0 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20 20  ->nPage-1) );.  
15ed0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d        pPager->nM
15ee0 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  axPage++;.      
15ef0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
15f00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65     rc = pager_re
15f10 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c  cycle(pPager, 1,
15f20 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66   &pPg);.      if
15f30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15f40 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
15f50 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
15f60 20 20 20 20 61 73 73 65 72 74 28 70 50 67 29 20      assert(pPg) 
15f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
15f80 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
15f90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
15fa0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
15fb0 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  )pgno<=pPager->o
15fc0 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
15fd0 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d     sqlite3CheckM
15fe0 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49  emory(pPager->aI
15ff0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38  nJournal, pgno/8
16000 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16010 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16020 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50  Open );.      pP
16030 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  g->inJournal = (
16040 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
16050 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  al[pgno/8] & (1<
16060 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a  <(pgno&7)))!=0;.
16070 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
16080 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ync = 0;.    }el
16090 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  se{.      pPg->i
160a0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
160b0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
160c0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
160d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
160e0 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e  Stmt && (int)pgn
160f0 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
16100 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ize.            
16110 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e   && (pPager->aIn
16120 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  Stmt[pgno/8] & (
16130 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
16140 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61   ){.      page_a
16150 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
16160 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
16170 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f  .      page_remo
16180 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
16190 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
161a0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
161b0 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20  ;.    pPg->nRef 
161c0 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f  = 1;.    REFINFO
161d0 28 70 50 67 29 3b 0a 0a 20 20 20 20 70 50 61 67  (pPg);..    pPag
161e0 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
161f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
16200 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
16210 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
16220 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
16230 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
16240 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
16250 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
16260 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ode ){.      sql
16270 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
16280 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
16290 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g));.      rc = 
162a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
162b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
162c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
162d0 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67  Populate the pag
162e0 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74  e with data, eit
162f0 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66  her by reading f
16300 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
16310 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72  .    ** file, or
16320 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
16330 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a  entire page to z
16340 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
16350 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72  if( sqlite3pager
16360 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
16370 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  r)<(int)pgno || 
16380 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6d  MEMDB ){.      m
16390 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
163a0 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
163b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
163c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
163d0 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d   assert( MEMDB==
163e0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
163f0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
16400 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d  ager->fd, (pgno-
16410 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
16420 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16430 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
16450 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
16460 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  (pPager->fd, PGH
16470 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
16480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
164a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
164b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
164c0 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64  TRACE3("FETCH %d
164d0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
164e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
164f0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
16500 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50  CODEC1(pPager, P
16510 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16520 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
16530 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16550 20 20 20 20 20 69 36 34 20 66 69 6c 65 53 69 7a       i64 fileSiz
16560 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e;.        int r
16570 63 32 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  c2 = sqlite3OsFi
16580 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
16590 64 2c 20 26 66 69 6c 65 53 69 7a 65 29 3b 0a 20  d, &fileSize);. 
165a0 20 20 20 20 20 20 20 69 66 28 20 72 63 32 21 3d         if( rc2!=
165b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 69 6c  SQLITE_OK || fil
165c0 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67  eSize>=pgno*pPag
165d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
165e0 09 20 20 2f 2a 20 41 6e 20 49 4f 20 65 72 72 6f  .  /* An IO erro
165f0 72 20 6f 63 63 75 72 65 64 20 69 6e 20 6f 6e 65  r occured in one
16600 20 6f 66 20 74 68 65 20 74 68 65 20 73 71 6c 69   of the the sqli
16610 74 65 33 4f 73 53 65 65 6b 28 29 20 6f 72 0a 20  te3OsSeek() or. 
16620 20 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69           ** sqli
16630 74 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c  te3OsRead() call
16640 73 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  s above. */.    
16650 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20        pPg->pgno 
16660 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 0;.          s
16670 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
16680 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  f(PGHDR_TO_DATA(
16690 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20  pPg));.         
166a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
166b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
166c0 20 20 20 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c       clear_simul
166d0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b  ated_io_error();
166e0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
166f0 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
16700 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
16710 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
16720 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
16730 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f  e{.        TEST_
16740 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
16750 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ad);.      }.   
16760 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20   }..    /* Link 
16770 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
16780 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c  e page hash tabl
16790 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 61 67  e */.    h = pag
167a0 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20  er_hash(pgno);. 
167b0 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
167c0 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
167d0 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
167e0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
167f0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
16800 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
16810 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
16820 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
16830 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
16840 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
16850 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
16860 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
16870 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
16880 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
16890 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
168a0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
168b0 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
168c0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
168d0 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
168e0 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
168f0 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
16900 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70  er->nHit);.    p
16910 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
16920 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47  }.  *ppPage = PG
16930 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16940 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16950 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
16960 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
16970 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
16980 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
16990 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
169a0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
169b0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
169c0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
169d0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
169e0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
169f0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
16a00 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
16a10 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
16a20 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
16a30 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
16a40 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
16a50 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
16a60 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
16a70 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
16a80 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
16a90 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
16aa0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
16ab0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
16ac0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
16ad0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
16ae0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
16af0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
16b00 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
16b10 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
16b20 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  appened..*/.void
16b30 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c   *sqlite3pager_l
16b40 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
16b50 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
16b60 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
16b70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16b80 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
16b90 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66   pgno!=0 );.  if
16ba0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
16bb0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
16bc0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
16bd0 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
16be0 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70  0;.  }.  pPg = p
16bf0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
16c00 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
16c10 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
16c20 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
16c30 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg);.  return PG
16c40 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16c50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
16c60 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
16c70 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
16c80 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
16c90 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
16ca0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
16cb0 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
16cc0 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
16cd0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
16ce0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
16cf0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
16d00 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
16d10 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
16d20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16d30 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
16d40 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
16d50 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69  3pager_unref(voi
16d60 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
16d70 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44  dr *pPg;..  /* D
16d80 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
16d90 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
16da0 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
16db0 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f    pPg = DATA_TO_
16dc0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
16dd0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
16de0 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
16df0 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
16e00 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  pPg);..  CHECK_P
16e10 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
16e20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
16e30 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
16e40 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
16e50 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
16e60 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
16e70 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
16e80 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
16e90 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
16ea0 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
16eb0 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
16ec0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
16ed0 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
16ee0 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
16ef0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
16f00 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
16f10 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
16f20 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
16f30 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
16f40 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
16f50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
16f60 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
16f70 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
16f80 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
16f90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
16fa0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
16fb0 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
16fc0 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20  tSynced==0 ){.  
16fd0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
16fe0 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a  stSynced = pPg;.
16ff0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
17000 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
17010 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
17020 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
17030 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17040 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
17050 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c   .    /* When al
17060 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68  l pages reach th
17070 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70  e freelist, drop
17080 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66   the read lock f
17090 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  rom.    ** the d
170a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
170b0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
170c0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73  >nRef--;.    ass
170d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
170e0 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  f>=0 );.    if( 
170f0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
17100 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  && !MEMDB ){.   
17110 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
17120 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
17130 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17140 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
17150 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
17160 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
17170 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
17180 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
17190 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
171a0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
171b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
171c0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
171d0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
171e0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
171f0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
17200 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
17210 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
17220 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
17230 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
17240 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
17250 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
17260 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
17270 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
17280 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
17290 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  t( !MEMDB );.  a
172a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
172b0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
172c0 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
172d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
172e0 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  lOpen==0 );.  as
172f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
17300 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
17310 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
17320 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
17330 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
17340 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
17350 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
17360 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
17370 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
17380 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
17390 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
173a0 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
173b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
173c0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
173d0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
173e0 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  nal;.  }.  rc = 
173f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
17400 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a  lusive(pPager->z
17410 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
17420 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20  ->jfd,.         
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17450 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50 61  tempFile);.  pPa
17460 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
17470 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
17480 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
17490 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
174a0 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  dr = 0;.  if( rc
174b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
174c0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
174d0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
174e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
174f0 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65  etFullSync(pPage
17500 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
17510 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73  full_fsync);.  s
17520 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53  qlite3OsSetFullS
17530 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
17540 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
17550 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  nc);.  sqlite3Os
17560 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50  OpenDirectory(pP
17570 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
17580 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a  r->zDirectory);.
17590 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
175a0 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
175b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
175c0 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
175d0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
175e0 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
175f0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
17600 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
17610 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
17620 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
17630 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
17640 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
17650 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
17660 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
17670 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
17680 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
17690 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
176a0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
176b0 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
176c0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
176d0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
176e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
176f0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  te3pager_stmt_be
17700 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
17710 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17720 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
17730 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
17740 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
17750 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
17760 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
17780 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
17790 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
177a0 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
177b0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
177c0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
177d0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
177e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
177f0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 69  Journal = 0;.  i
17800 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
17810 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  MEM ){.    /* If
17820 20 74 68 69 73 20 77 61 73 20 61 20 6d 61 6c 6c   this was a mall
17830 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 74 68  oc() failure, th
17840 65 6e 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 62  en we will not b
17850 65 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61  e closing the pa
17860 67 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ger.    ** file.
17870 20 53 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 6a   So delete any j
17880 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 65 20 6d  ournal file we m
17890 61 79 20 68 61 76 65 20 6a 75 73 74 20 63 72 65  ay have just cre
178a0 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ated. Otherwise,
178b0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 79 73 74  .    ** the syst
178c0 65 6d 20 77 69 6c 6c 20 67 65 74 20 63 6f 6e 66  em will get conf
178d0 75 73 65 64 2c 20 77 65 20 68 61 76 65 20 61 20  used, we have a 
178e0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
178f0 20 66 69 6c 65 20 61 6e 64 20 61 0a 20 20 20 20   file and a.    
17900 2a 2a 20 6d 79 73 74 65 72 69 6f 75 73 20 6a 6f  ** mysterious jo
17910 75 72 6e 61 6c 20 68 61 73 20 61 70 70 65 61 72  urnal has appear
17920 65 64 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ed in the filesy
17930 73 74 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  stem..    */.   
17940 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
17950 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
17960 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
17970 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
17980 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
17990 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
179a0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
179b0 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72  _UNLOCK;.  }.  r
179c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
179d0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
179e0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
179f0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
17a00 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
17a10 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
17a20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
17a30 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
17a40 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63    sqlite3pager_c
17a50 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65  ommit() is calle
17a60 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
17a70 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
17a80 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
17a90 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
17aa0 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63 61  er_close() is ca
17ab0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
17ac0 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
17ad0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
17ae0 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e  on every outstan
17af0 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  ding page..**.**
17b00 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
17b10 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
17b20 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
17b30 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
17b40 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
17b50 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
17b60 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
17b70 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
17b80 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20   is used merely 
17b90 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20  to.** acquire a 
17ba0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
17bb0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
17bc0 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
17bd0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72   there is.** alr
17be0 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
17bf0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
17c00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
17c10 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  nd parameter ind
17c20 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20  icates how much 
17c30 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74  space in bytes t
17c40 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a  o reserve for a.
17c50 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
17c60 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74  l file-name at t
17c70 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
17c80 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20  journal when it 
17c90 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  is created..**.*
17ca0 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * A journal file
17cb0 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68   is opened if th
17cc0 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
17cd0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72  orary file.  For
17ce0 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
17cf0 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  les, the opening
17d00 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
17d10 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
17d20 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
17d30 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65  an.** actual nee
17d40 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
17d50 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
17d60 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
17d70 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65   is already rese
17d80 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  rved for writing
17d90 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
17da0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
17db0 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
17dc0 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ue, go ahead and
17dd0 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   get an EXCLUSIV
17de0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  E lock on the fi
17df0 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  le.** immediatel
17e00 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69  y instead of wai
17e10 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72  ting until we tr
17e20 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63  y to flush the c
17e30 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78  ache.  The.** ex
17e40 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20  Flag is ignored 
17e50 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
17e60 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
17e70 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
17e80 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f  e3pager_begin(vo
17e90 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 65  id *pData, int e
17ea0 78 46 6c 61 67 29 7b 0a 20 20 50 67 48 64 72 20  xFlag){.  PgHdr 
17eb0 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
17ec0 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
17ed0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
17ee0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
17ef0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17f00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
17f10 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
17f20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
17f30 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
17f40 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
17f50 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
17f60 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
17f70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
17f80 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
17f90 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
17fa0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
17fb0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
17fc0 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67  SIVE;.      pPag
17fd0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
17fe0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
17ff0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18010 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
18020 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
18030 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
18040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18050 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
18060 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
18070 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
18080 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
18090 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
180a0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
180b0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
180c0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
180d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
180e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
180f0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18100 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
18110 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
18120 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20  Cache = 0;.     
18130 20 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43   TRACE2("TRANSAC
18140 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
18150 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
18160 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18170 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
18180 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
18190 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
181a0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
181b0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
181c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
181d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
181e0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
181f0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
18200 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
18210 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
18220 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
18230 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
18240 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
18250 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
18260 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
18270 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
18280 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
18290 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
182a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
182b0 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
182c0 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
182d0 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
182e0 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
182f0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
18300 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
18310 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
18320 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
18330 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
18340 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
18350 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
18360 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
18370 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
18380 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
18390 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
183a0 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
183b0 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
183c0 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
183d0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
183e0 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
183f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
18400 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
18410 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
18420 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
18430 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
18440 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
18450 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
18460 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
18470 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
18480 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
18490 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
184a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
184b0 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
184c0 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
184d0 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
184e0 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61  t() or sqlite3pa
184f0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74  ger_rollback() t
18500 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69  o.** reset..*/.i
18510 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
18520 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74  write(void *pDat
18530 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
18540 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
18550 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
18560 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
18570 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
18580 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
18590 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
185a0 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
185b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
185c0 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
185d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
185e0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
185f0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
18600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18610 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  PERM;.  }..  ass
18620 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
18630 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
18640 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
18650 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
18660 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
18670 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
18680 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
18690 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
186a0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
186b0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
186c0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  away..  */.  pPg
186d0 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69  ->dirty = 1;.  i
186e0 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
186f0 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d  l && (pPg->inStm
18700 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  t || pPager->stm
18710 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
18720 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
18730 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ache = 1;.  }els
18740 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
18750 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
18760 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
18770 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
18780 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
18790 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
187a0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
187b0 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
187c0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
187d0 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
187e0 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
187f0 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
18800 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
18810 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
18820 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
18830 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
18840 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
18850 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
18860 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
18870 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18880 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  e3pager_begin(pD
18890 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ata, 0);.    if(
188a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
188b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
188c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
188d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
188e0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
188f0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
18900 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
18910 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
18920 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
18930 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
18940 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
18950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
18970 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18980 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18990 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
189a0 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
189b0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
189c0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
189d0 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
189e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
189f0 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
18a00 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
18a10 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
18a20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
18a30 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
18a40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
18a50 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
18a60 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
18a70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18a80 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
18a90 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
18aa0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
18ab0 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
18ac0 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
18ad0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45  useJournal || ME
18ae0 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66  MDB) ){.      if
18af0 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
18b00 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
18b10 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
18b20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20    int szPg;.    
18b30 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
18b40 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73  .          PgHis
18b50 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
18b60 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
18b70 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
18b80 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52      TRACE3("JOUR
18b90 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
18ba0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
18bb0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
18bc0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18bd0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
18be0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
18bf0 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
18c00 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
18c10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
18c20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
18c30 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
18c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
18c50 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
18c60 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
18c70 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
18c80 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
18c90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
18ca0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
18cb0 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a  2 cksum, saved;.
18cc0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
18cd0 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20  pData2, *pEnd;. 
18ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
18cf0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
18d00 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
18d10 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
18d20 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
18d30 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
18d40 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
18d50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
18d60 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
18d70 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
18d80 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
18d90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18da0 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
18db0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
18dc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
18dd0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
18de0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
18df0 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
18e00 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
18e10 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
18e20 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
18e30 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61      pEnd = pData
18e40 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  2 + pPager->page
18e50 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
18e60 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20  pData2 -= 4;.   
18e70 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
18e80 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20  (u32*)pEnd;.    
18e90 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
18ea0 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  pEnd, cksum);.  
18eb0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
18ec0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
18ed0 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  8;.          put
18ee0 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70  32bits(pData2, p
18ef0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
18f00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18f10 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
18f20 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a  >jfd, pData2, sz
18f30 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Pg);.          p
18f40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
18f50 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20  f += szPg;.     
18f60 20 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f 55       TRACE4("JOU
18f70 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
18f80 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
18f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fa0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
18fb0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
18fc0 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
18fd0 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70          *(u32*)p
18fe0 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20  End = saved;... 
18ff0 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
19000 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67   occured writing
19010 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
19020 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
19030 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
19040 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
19050 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
19060 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
19070 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
19080 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
190a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
190b0 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
190c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
190d0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ec++;.          
190e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
190f0 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
19100 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
19110 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
19120 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
19130 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
19140 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e            pPg->n
19150 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
19160 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
19170 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
19180 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
19190 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
191a0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
191b0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
191c0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
191d0 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
191e0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
191f0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
19200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19210 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
19220 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
19230 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
19240 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
19250 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
19260 20 20 20 54 52 41 43 45 34 28 22 41 50 50 45 4e     TRACE4("APPEN
19270 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
19280 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
192a0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
192b0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
192c0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d  edSync);.      }
192d0 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
192e0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
192f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
19300 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
19310 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  }.      pPg->inJ
19320 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
19330 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
19340 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
19350 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
19360 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
19370 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
19380 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
19390 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
193a0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
193b0 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
193c0 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
193d0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
193e0 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
193f0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
19400 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
19410 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
19420 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
19430 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
19440 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
19450 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
19460 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53  Use && !pPg->inS
19470 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  tmt && (int)pPg-
19480 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
19490 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  tmtSize ){.     
194a0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
194b0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
194c0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
194d0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
194e0 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
194f0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
19500 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
19510 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
19520 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
19530 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
19540 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >pStmt==0 );.   
19550 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
19560 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
19570 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
19580 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
19590 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
195a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
195b0 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74  emcpy(pHist->pSt
195c0 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  mt, PGHDR_TO_DAT
195d0 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
195e0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
195f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41     }.        TRA
19600 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
19610 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
19620 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19630 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
19640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19650 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20     char *pData2 
19660 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
19670 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
19680 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20 20  o, 7)-4;.       
19690 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61   put32bits(pData
196a0 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  2, pPg->pgno);. 
196b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
196c0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
196d0 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c  r->stfd, pData2,
196e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
196f0 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 54 52  e+4);.        TR
19700 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
19710 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
19720 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
19730 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
19740 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
19750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19760 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19770 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19780 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
19790 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
197a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
197b0 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
197c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
197d0 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
197e0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
197f0 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20  no&7);.      }. 
19800 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
19810 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
19820 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19830 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
19840 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
19850 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
19860 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
19870 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
19880 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
19890 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
198a0 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
198b0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
198c0 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
198d0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
198e0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
198f0 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20  r->dbSize++;.   
19900 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19910 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
19920 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
19930 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
19940 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
19950 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
19960 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61  .** to sqlite3pa
19970 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e  ger_write().  In
19980 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
19990 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
199a0 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
199b0 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
199c0 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
199d0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
199e0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  t sqlite3pager_i
199f0 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20  swriteable(void 
19a00 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
19a10 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
19a20 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
19a30 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
19a40 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y;.}.#endif..#if
19a50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19a60 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65  _VACUUM./*.** Re
19a70 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
19a80 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  t of a single pa
19a90 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f  ge with the info
19aa0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74  rmation in the t
19ab0 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  hird.** argument
19ac0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19ad0 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28  pager_overwrite(
19ae0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
19af0 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
19b00 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a  pData){.  void *
19b10 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  pPage;.  int rc;
19b20 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
19b30 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
19b40 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b  , pgno, &pPage);
19b50 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19b60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
19b70 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
19b80 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
19b90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19ba0 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  K ){.      memcp
19bb0 79 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20  y(pPage, pData, 
19bc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19bd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
19be0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
19bf0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
19c00 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
19c10 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
19c20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
19c30 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
19c40 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
19c50 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
19c60 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
19c70 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67  tion on page "pg
19c80 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20  no" back to the 
19c90 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
19ca0 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
19cb0 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
19cc0 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
19cd0 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
19ce0 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
19cf0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
19d00 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
19d10 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
19d20 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
19d30 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
19d40 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
19d50 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
19d60 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
19d70 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
19d80 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
19d90 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
19da0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
19db0 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
19dc0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
19dd0 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65  nt_rollback() be
19de0 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64  low, more than d
19df0 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a  ouble the speed.
19e00 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45  ** of large INSE
19e10 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e  RT operations an
19e20 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  d quadruple the 
19e30 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44  speed of large D
19e40 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ELETEs..**.** Wh
19e50 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
19e60 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74  is called, set t
19e70 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
19e80 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a  k flag to true..
19e90 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
19ea0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61  lls to sqlite3pa
19eb0 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
19ec0 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65  k() for the same
19ed0 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68   page.** will th
19ee0 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f  ereafter be igno
19ef0 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65  red.  This is ne
19f00 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64  cessary to avoid
19f10 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68   a problem.** wh
19f20 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20  ere a page with 
19f30 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f  data is added to
19f40 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
19f50 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66  ring one part of
19f60 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
19f70 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66  n then removed f
19f80 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
19f90 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20   during a later 
19fa0 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73  part.** of the s
19fb0 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ame transaction 
19fc0 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73  and reused for s
19fd0 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
19fe0 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69  e.  When it.** i
19ff0 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f  s first added to
1a000 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74   the freelist, t
1a010 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1a020 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75  alled.  When reu
1a030 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74  sed,.** the dont
1a040 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  _rollback() rout
1a050 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
1a060 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
1a070 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  page contains.**
1a080 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
1a090 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
1a0a0 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
1a0b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
1a0c0 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20  spite.** of the 
1a0d0 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1a0e0 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
1a0f0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
1a100 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
1a110 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
1a120 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1a130 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65    if( MEMDB ) re
1a140 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70  turn;..  pPg = p
1a150 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1a160 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73  er, pgno);.  ass
1a170 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 20 20  ert( pPg!=0 );  
1a180 2f 2a 20 57 65 20 6e 65 76 65 72 20 63 61 6c 6c  /* We never call
1a190 20 5f 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e 6c   _dont_write unl
1a1a0 65 73 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ess the page is 
1a1b0 69 6e 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67 2d  in mem */.  pPg-
1a1c0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1a1d0 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
1a1e0 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72  dirty && !pPager
1a1f0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1a200 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
1a210 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d  bSize==(int)pPg-
1a220 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d  >pgno && pPager-
1a230 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67  >origDbSize<pPag
1a240 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
1a250 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
1a260 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74  ages is the last
1a270 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
1a280 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
1a290 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a  as grown.      *
1a2a0 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  * during the cur
1a2b0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1a2c0 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61  , then do NOT ma
1a2d0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
1a2e0 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57  lean..      ** W
1a2f0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
1a300 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20   file grows, we 
1a310 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
1a320 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
1a330 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20  e.      ** gets 
1a340 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74  written at least
1a350 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68   once so that th
1a360 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c  e disk file will
1a370 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a   be the correct.
1a380 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49        ** size. I
1a390 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69  f you do not wri
1a3a0 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64  te this page and
1a3b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1a3c0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f   file.      ** o
1a3d0 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20  n the disk ends 
1a3e0 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61  up being too sma
1a3f0 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61  ll, that can lea
1a400 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20  d to database.  
1a410 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f      ** corruptio
1a420 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78  n during the nex
1a430 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
1a440 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
1a450 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  e{.      TRACE3(
1a460 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
1a470 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67   %d of %d\n", pg
1a480 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1a490 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  er));.      pPg-
1a4a0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64  >dirty = 0;.#ifd
1a4b0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1a4c0 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
1a4d0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
1a4e0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
1a4f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1a500 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  }.}../*.** A cal
1a510 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
1a520 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
1a530 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c  r that if a roll
1a540 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  back occurs,.** 
1a550 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1a560 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ary to restore t
1a570 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67  he data on the g
1a580 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73  iven page.  This
1a590 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
1a5a0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
1a5b0 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64  t have to record
1a5c0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1a5d0 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61  in the.** rollba
1a5e0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76  ck journal..*/.v
1a5f0 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
1a600 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76  _dont_rollback(v
1a610 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
1a620 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
1a630 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
1a640 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1a650 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1a660 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1a670 73 74 61 74 65 21 3d 50 41 47 45 52 5f 45 58 43  state!=PAGER_EXC
1a680 4c 55 53 49 56 45 20 7c 7c 20 70 50 61 67 65 72  LUSIVE || pPager
1a690 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1a6a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1a6b0 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1a6c0 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  back || pPager->
1a6d0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
1a6e0 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e  | MEMDB ) return
1a6f0 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  ;.  if( !pPg->in
1a700 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
1a710 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
1a720 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1a730 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a740 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1a750 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l!=0 );.    pPag
1a760 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1a770 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1a780 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1a790 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
1a7a0 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  nal = 1;.    if(
1a7b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1a7c0 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  se ){.      pPag
1a7d0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
1a7e0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1a7f0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1a800 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
1a810 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
1a820 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 33      }.    TRACE3
1a830 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  ("DONT_ROLLBACK 
1a840 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
1a850 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47  , pPg->pgno, PAG
1a860 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1a870 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1a880 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70  >stmtInUse && !p
1a890 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69  Pg->inStmt && (i
1a8a0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
1a8b0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
1a8c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1a8d0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
1a8e0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
1a8f0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1a900 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
1a910 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1a920 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
1a930 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1a940 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1a950 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1a960 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
1a970 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  t_list(pPg);.  }
1a980 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
1a990 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
1a9a0 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  B./*.** Clear a 
1a9b0 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a  PgHistory block.
1a9c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
1a9d0 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69  learHistory(PgHi
1a9e0 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20  story *pHist){. 
1a9f0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
1aa00 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c  t->pOrig);.  sql
1aa10 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
1aa20 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e  Stmt);.  pHist->
1aa30 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69  pOrig = 0;.  pHi
1aa40 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d  st->pStmt = 0;.}
1aa50 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
1aa60 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23  learHistory(x).#
1aa70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  endif../*.** Com
1aa80 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
1aa90 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1aaa0 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
1aab0 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
1aac0 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
1aad0 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
1aae0 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
1aaf0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
1ab00 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
1ab10 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1ab20 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
1ab30 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
1ab40 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
1ab50 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1ab60 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50  e3pager_commit(P
1ab70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ab80 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
1ab90 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
1aba0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1abb0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1abc0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1abd0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1abe0 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
1abf0 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
1ac00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1ac10 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f    }.  TRACE2("CO
1ac20 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1ac30 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1ac40 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1ac50 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1ac60 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1ac70 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68  (pPager);.    wh
1ac80 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20  ile( pPg ){.    
1ac90 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50    clearHistory(P
1aca0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1acb0 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  , pPager));.    
1acc0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1acd0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
1ace0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1acf0 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
1ad00 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
1ad10 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
1ad20 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
1ad30 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
1ad40 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66  Dirty;.    }.#if
1ad50 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
1ad60 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1ad70 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
1ad80 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
1ad90 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1ada0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1adb0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1adc0 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
1add0 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
1ade0 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
1adf0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
1ae00 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
1ae10 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
1ae20 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
1ae30 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d  ndif.    pPager-
1ae40 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1ae50 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1ae60 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
1ae70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ae80 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  OK;.  }.  if( pP
1ae90 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1aea0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78  ==0 ){.    /* Ex
1aeb0 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75  it early (withou
1aec0 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65  t doing the time
1aed0 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74  -consuming sqlit
1aee0 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73  e3OsSync() calls
1aef0 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72  ).    ** if ther
1af00 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63  e have been no c
1af10 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1af20 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
1af30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1af40 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  er->needSync==0 
1af50 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1af60 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
1af70 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1af80 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
1af90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1afa0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
1afb0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1afc0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1afd0 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61  e3pager_sync(pPa
1afe0 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  ger, 0, 0);.  if
1aff0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b000 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1b010 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
1b020 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1b030 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
1b040 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1b060 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
1b070 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
1b080 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
1b090 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
1b0a0 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
1b0b0 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
1b0c0 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
1b0d0 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
1b0e0 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
1b0f0 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
1b100 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b110 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
1b120 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
1b130 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
1b140 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
1b150 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
1b160 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45  protocol (SQLITE
1b170 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e  _PROTOCOL) or un
1b180 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
1b190 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
1b1a0 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
1b1b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b1c0 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
1b1d0 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
1b1e0 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
1b1f0 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
1b200 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
1b210 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
1b220 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
1b230 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
1b240 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
1b250 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
1b260 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1b270 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1b280 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67  ger_rollback(Pag
1b290 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1b2a0 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28  nt rc;.  TRACE2(
1b2b0 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
1b2c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b2d0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1b2e0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1b2f0 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72      for(p=pPager
1b300 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
1b310 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
1b320 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1b330 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1b340 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62   !p->alwaysRollb
1b350 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ack );.      if(
1b360 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20   !p->dirty ){.  
1b370 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
1b380 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
1b390 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1b3a0 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b  ager))->pOrig );
1b3b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1b3c0 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1b3d0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1b3e0 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74   pPager))->pStmt
1b3f0 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   );.        cont
1b400 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  inue;.      }.. 
1b410 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
1b420 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1b430 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1b440 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
1b450 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1b460 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
1b470 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  , pHist->pOrig, 
1b480 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b490 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
1b4a0 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45  3("ROLLBACK-PAGE
1b4b0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d   %d of %d\n", p-
1b4c0 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1b4d0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
1b4e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52  else{.        TR
1b4f0 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73  ACE3("PAGE %d is
1b500 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c   clean on %d\n",
1b510 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
1b520 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1b530 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48    }.      clearH
1b540 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
1b550 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20       p->dirty = 
1b560 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f  0;.      p->inJo
1b570 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
1b580 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a   p->inStmt = 0;.
1b590 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74        p->pPrevSt
1b5a0 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d  mt = p->pNextStm
1b5b0 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66  t = 0;..      if
1b5c0 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
1b5d0 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ter ){.        p
1b5e0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
1b5f0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1b600 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1b610 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
1b620 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70      .    }.    p
1b630 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1b640 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
1b650 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
1b660 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d  rigDbSize;.    m
1b670 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
1b680 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1b690 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
1b6a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1b6b0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1b6c0 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
1b6d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1b6e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
1b6f0 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61  rtyCache || !pPa
1b700 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1b710 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1b720 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1b730 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1b740 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1b750 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1b760 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
1b770 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
1b780 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
1b790 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
1b7a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1b7b0 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
1b7c0 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
1b7d0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
1b7e0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
1b7f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1b800 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
1b810 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1b820 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1b830 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
1b840 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
1b850 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
1b860 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70  er);.    rc2 = p
1b870 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
1b880 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1b890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b8a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
1b8b0 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  2;.    }.  }else
1b8c0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1b8d0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1b8e0 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
1b8f0 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20  >dbSize = -1;.. 
1b900 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
1b910 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
1b920 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
1b930 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
1b940 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
1b950 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
1b960 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
1b970 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
1b980 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
1b990 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   ** persistent..
1b9a0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 61    */.  return pa
1b9b0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1b9c0 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , rc);.}../*.** 
1b9d0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1b9e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b9f0 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
1ba00 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
1ba10 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
1ba20 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
1ba30 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
1ba40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1ba50 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50  ger_isreadonly(P
1ba60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ba70 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1ba80 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
1ba90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1baa0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
1bab0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
1bac0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
1bad0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74  qlite3pager_stat
1bae0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
1baf0 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
1bb00 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  [11];.  a[0] = p
1bb10 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
1bb20 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
1bb30 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
1bb40 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
1bb50 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
1bb60 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
1bb70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
1bb80 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
1bb90 65 72 72 43 6f 64 65 3b 0a 23 69 66 64 65 66 20  errCode;.#ifdef 
1bba0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 61 5b  SQLITE_TEST.  a[
1bbb0 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
1bbc0 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
1bbd0 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
1bbe0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66  ] = pPager->nOvf
1bbf0 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  l;.  a[9] = pPag
1bc00 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
1bc10 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
1bc20 69 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ite;.#endif.  re
1bc30 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn a;.}../*.**
1bc40 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65   Set the stateme
1bc50 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e  nt rollback poin
1bc60 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
1bc70 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
1bc80 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
1bc90 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1bca0 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f  nal already.** o
1bcb0 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74  pen.  A new stat
1bcc0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
1bcd0 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61   created that ca
1bce0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c  n be used to rol
1bcf0 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73  lback.** changes
1bd00 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   of a single SQL
1bd10 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20   command within 
1bd20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63  a larger transac
1bd30 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1bd40 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62  ite3pager_stmt_b
1bd50 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
1bd60 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1bd70 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
1bd80 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
1bd90 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ];.  assert( !pP
1bda0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1bdb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1bdc0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
1bdd0 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d 54  ;.  TRACE2("STMT
1bde0 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41  -BEGIN %d\n", PA
1bdf0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1be00 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1be10 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
1be20 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  nUse = 1;.    pP
1be30 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
1be40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1be50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1be60 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1be70 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1be80 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61  lOpen ){.    pPa
1be90 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1bea0 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  n = 1;.    retur
1beb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1bec0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1bed0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1bee0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ;.  pPager->aInS
1bef0 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
1bf00 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
1bf10 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
1bf20 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1bf30 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73  t==0 ){.    /* s
1bf40 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1bf50 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
1bf60 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  LOCK); */.    re
1bf70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1bf80 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  M;.  }.#ifndef N
1bf90 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c  DEBUG.  rc = sql
1bfa0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1bfb0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
1bfc0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
1bfd0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
1bfe0 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
1bff0 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ed;.  assert( pP
1c000 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
1c010 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  == pPager->journ
1c020 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a  alOff );.#endif.
1c030 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
1c040 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ize = pPager->jo
1c050 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
1c060 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
1c070 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1c080 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
1c090 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
1c0a0 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70  r->stmtCksum = p
1c0b0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
1c0c0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
1c0d0 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
1c0e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1c0f0 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
1c100 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64  p, &pPager->stfd
1c110 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1c120 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
1c130 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67  failed;.    pPag
1c140 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
1c150 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1c160 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
1c170 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1c180 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
1c190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
1c1a0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
1c1b0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
1c1c0 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  aInStmt ){.    s
1c1d0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
1c1e0 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->aInStmt);.    
1c1f0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1c200 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1c210 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1c220 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
1c230 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1c240 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
1c250 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
1c260 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
1c270 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1c280 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
1c290 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32  Next;.    TRACE2
1c2a0 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
1c2b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c2c0 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
1c2d0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
1c2e0 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
1c2f0 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
1c300 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
1c310 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
1c320 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20  ->stfd, 0); */. 
1c330 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1c340 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1c350 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
1c360 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
1c370 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67     }.    for(pPg
1c380 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
1c390 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
1c3a0 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
1c3b0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
1c3c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1c3d0 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
1c3e0 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
1c3f0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
1c400 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
1c410 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
1c420 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1c430 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1c440 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1c450 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1c460 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1c470 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
1c480 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
1c490 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
1c4a0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1c4b0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
1c4c0 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
1c4d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1c4e0 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
1c4f0 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
1c500 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
1c510 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
1c520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1c540 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  ack a statement.
1c550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1c560 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61  ager_stmt_rollba
1c570 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
1c580 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1c590 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1c5a0 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43  nUse ){.    TRAC
1c5b0 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
1c5c0 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
1c5d0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
1c5e0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1c5f0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1c600 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
1c610 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
1c620 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74  pPg=pPg->pNextSt
1c630 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  mt){.        PgH
1c640 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1c650 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1c660 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1c670 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
1c680 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
1c690 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
1c6a0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69  O_DATA(pPg), pHi
1c6b0 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  st->pStmt, pPage
1c6c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1c6d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
1c6e0 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
1c6f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
1c700 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
1c710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c720 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1c730 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
1c740 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d  tmtSize;.      m
1c750 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
1c760 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
1c770 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1c790 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c   = pager_stmt_pl
1c7a0 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
1c7b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1c7c0 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
1c7d0 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
1c7e0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
1c7f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1c800 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
1c810 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
1c820 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1c830 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
1c840 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
1c850 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
1c860 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1c870 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61  ite3pager_filena
1c880 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1c890 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1c8a0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
1c8b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1c8c0 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
1c8d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c8e0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
1c8f0 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64   *sqlite3pager_d
1c900 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  irname(Pager *pP
1c910 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1c920 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
1c930 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ry;.}../*.** Ret
1c940 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
1c950 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
1c960 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
1c970 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1c980 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61  3pager_journalna
1c990 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1c9a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1c9b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
1c9c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1c9d0 75 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61  ue if fsync() ca
1c9e0 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  lls are disabled
1c9f0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
1ca00 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
1ca10 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72  * if fsync()s ar
1ca20 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61  e executed norma
1ca30 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
1ca40 74 65 33 70 61 67 65 72 5f 6e 6f 73 79 6e 63 28  te3pager_nosync(
1ca50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ca60 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1ca70 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  >noSync;.}../*.*
1ca80 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20  * Set the codec 
1ca90 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a  for this pager.*
1caa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1cab0 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20  ger_set_codec(. 
1cac0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a   Pager *pPager,.
1cad0 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
1cae0 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
1caf0 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  no,int),.  void 
1cb00 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20  *pCodecArg.){.  
1cb10 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
1cb20 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
1cb30 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70  r->pCodecArg = p
1cb40 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  CodecArg;.}../*.
1cb50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1cb60 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
1cb70 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62  rement the datab
1cb80 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
1cb90 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72  counter,.** stor
1cba0 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66  ed at byte 24 of
1cbb0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
1cbc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1cbd0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1cbe0 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
1cbf0 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a  Pager){.  void *
1cc00 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72 20 2a  pPage;.  PgHdr *
1cc10 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68  pPgHdr;.  u32 ch
1cc20 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20  ange_counter;.  
1cc30 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70  int rc;..  /* Op
1cc40 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
1cc50 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
1cc60 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  g. */.  rc = sql
1cc70 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
1cc80 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 29  ager, 1, &pPage)
1cc90 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1cca0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1ccb0 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
1ccc0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1ccd0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1cce0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1ccf0 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  n rc;..  /* Read
1cd00 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
1cd10 75 65 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a  ue at byte 24. *
1cd20 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44 41 54  /.  pPgHdr = DAT
1cd30 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61 67 65  A_TO_PGHDR(pPage
1cd40 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  );.  change_coun
1cd50 74 65 72 20 3d 20 72 65 74 72 69 65 76 65 33 32  ter = retrieve32
1cd60 62 69 74 73 28 70 50 67 48 64 72 2c 20 32 34 29  bits(pPgHdr, 24)
1cd70 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
1cd80 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1cd90 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1cda0 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1cdb0 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f  24. */.  change_
1cdc0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 70 75 74  counter++;.  put
1cdd0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 50  32bits(((char*)P
1cde0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1cdf0 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65  Hdr))+24, change
1ce00 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a  _counter);..  /*
1ce10 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
1ce20 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
1ce30 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
1ce40 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72  nref(pPage);.  r
1ce50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ce60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1ce70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ce80 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
1ce90 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
1cea0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
1ceb0 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
1cec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1ced0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1cee0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
1cef0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
1cf00 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
1cf10 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
1cf20 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
1cf30 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
1cf40 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
1cf50 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1cf60 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1cf70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1cf80 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1cf90 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
1cfa0 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
1cfb0 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
1cfc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1cfd0 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
1cfe0 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
1cff0 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
1d000 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
1d010 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
1d020 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
1d030 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1d040 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
1d050 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1d060 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
1d070 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
1d080 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
1d090 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
1d0a0 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
1d0b0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
1d0c0 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
1d0d0 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
1d0e0 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
1d0f0 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e   parameter nTrun
1d100 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  c is non-zero, t
1d110 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  hen the pager fi
1d120 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
1d130 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67  to.** nTrunc pag
1d140 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64  es (this is used
1d150 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1d160 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69  databases)..*/.i
1d170 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1d180 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
1d190 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
1d1a0 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54  zMaster, Pgno nT
1d1b0 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
1d1c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1d1d0 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45  TRACE4("DATABASE
1d1e0 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
1d1f0 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63  Master=%s nTrunc
1d200 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
1d210 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1d220 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
1d230 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  c);..  /* If thi
1d240 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
1d250 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
1d260 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
1d270 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
1d280 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
1d290 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1d2a0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
1d2b0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1d2c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1d2d0 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
1d2e0 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1d2f0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
1d300 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1d310 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d320 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1d330 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  );..    /* If a 
1d340 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1d350 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
1d360 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1d370 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
1d380 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1d390 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
1d3a0 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
1d3b0 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
1d3c0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
1d3d0 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
1d3e0 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
1d3f0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
1d400 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
1d410 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
1d420 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
1d430 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
1d440 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
1d450 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1d460 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
1d470 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
1d480 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
1d490 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
1d4a0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1d4b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1d4c0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1d4d0 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  unter(pPager);. 
1d4e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d4f0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1d500 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
1d510 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1d520 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
1d530 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
1d540 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
1d550 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
1d560 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
1d570 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
1d580 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
1d590 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
1d5a0 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
1d5b0 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
1d5c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1d5d0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1d5e0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
1d5f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
1d600 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64   i;.        void
1d610 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20   *pPage;.       
1d620 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47   int iSkip = PAG
1d630 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1d640 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  r);.        for(
1d650 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
1d660 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d670 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
1d680 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65       if( !(pPage
1d690 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f  r->aInJournal[i/
1d6a0 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29  8] & (1<<(i&7)))
1d6b0 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1d6d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1d6e0 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
1d6f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1d700 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d710 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1d720 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1d730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1d740 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
1d750 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1d760 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1d770 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1d780 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d790 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1d7a0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1d7b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
1d7c0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1d7d0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
1d7e0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1d7f0 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1d800 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d810 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1d820 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72  nc_exit;.      r
1d830 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1d840 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1d850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d860 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1d870 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
1d880 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d890 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1d8a0 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1d8b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d8c0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1d8d0 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
1d8e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d8f0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1d900 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1d910 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
1d920 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
1d930 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
1d940 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
1d950 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1d960 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1d970 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
1d980 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1d990 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
1d9a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d9b0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1d9c0 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79  exit;..    /* Sy
1d9d0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1d9e0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1d9f0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1da00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1da10 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1da20 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
1da30 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
1da40 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
1da50 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  NCED;.  }..sync_
1da60 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
1da70 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1da80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1da90 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
1daa0 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
1dab0 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20  ied by pData to 
1dac0 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
1dad0 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
1dae0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
1daf0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
1db00 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1db10 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65  e pgno. If curre
1db20 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20  nt page.** pgno 
1db30 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
1db40 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
1db50 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
1db60 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20  t written there 
1db70 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f  by.** by this ro
1db80 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20  utine. The same 
1db90 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70  applies to the p
1dba0 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73  age pData refers
1dbb0 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a   to on entry to.
1dbc0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1dbd0 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
1dbe0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65  s to the page re
1dbf0 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74  fered to by pDat
1dc00 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  a remain valid. 
1dc10 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
1dc20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
1dc30 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1dc40 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20  Data (i.e. data 
1dc50 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
1dc60 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
1dc70 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
1dc80 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
1dc90 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1dca0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1dcb0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
1dcc0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
1dcd0 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
1dce0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1dcf0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
1dd00 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
1dd10 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1dd20 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
1dd30 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
1dd40 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
1dd50 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
1dd60 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
1dd70 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
1dd80 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
1dd90 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
1dda0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
1ddb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1ddc0 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61  ager_movepage(Pa
1ddd0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
1dde0 64 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70  d *pData, Pgno p
1ddf0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1de00 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1de10 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48  DR(pData);.  PgH
1de20 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69  dr *pPgOld; .  i
1de30 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
1de40 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
1de50 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1de60 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43  Ref>0 );..  TRAC
1de70 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
1de80 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
1de90 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
1dea0 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
1deb0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1dec0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1ded0 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66  nc, pgno);..  if
1dee0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
1def0 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
1df00 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1df10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1df20 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1df30 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1df40 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
1df50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1df60 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
1df70 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
1df80 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61  om it's hash-cha
1df90 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
1dfa0 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1dfb0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1dfc0 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
1dfd0 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
1dfe0 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
1dff0 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
1e000 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
1e010 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
1e020 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
1e030 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
1e040 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
1e050 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
1e060 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
1e070 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
1e080 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
1e090 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
1e0a0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20  ..  */.  pPgOld 
1e0b0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1e0c0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1e0d0 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
1e0e0 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1e0f0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
1e100 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
1e110 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
1e120 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69  ;.    pPgOld->di
1e130 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1e140 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
1e150 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1e160 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75  t( pPgOld->inJou
1e170 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50  rnal );.      pP
1e180 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1e190 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1e1a0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1e1b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e1c0 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
1e1d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61   }.  }..  /* Cha
1e1e0 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
1e1f0 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
1e200 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
1e210 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
1e220 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e  n. */.  pPg->pgn
1e230 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
1e240 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
1e250 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1e260 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
1e270 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e280 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1e290 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ash==0 );.    pP
1e2a0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1e2b0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1e2c0 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
1e2d0 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
1e2e0 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67  aHash[h];.  pPag
1e2f0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1e300 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76  Pg;.  pPg->pPrev
1e310 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67  Hash = 0;..  pPg
1e320 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70  ->dirty = 1;.  p
1e330 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1e340 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  e = 1;..  if( ne
1e350 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
1e360 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
1e370 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
1e380 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1e390 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
1e3a0 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
1e3b0 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
1e3c0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
1e3d0 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
1e3e0 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
1e3f0 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
1e400 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
1e410 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
1e420 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
1e430 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  the .    ** Page
1e440 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.aInJournal bit
1e450 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
1e460 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
1e470 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64  remedied by load
1e480 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ing.    ** the p
1e490 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
1e4a0 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
1e4b0 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1e4c0 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20  eedSync flag..  
1e4d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1e4e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1e4f0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
1e500 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
1e510 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
1e520 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
1e530 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1e540 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
1e550 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
1e560 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65  ;.    void *pNee
1e570 64 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72  dSync;.    asser
1e580 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1e590 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
1e5a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1e5b0 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
1e5c0 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e  cPgno, &pNeedSyn
1e5d0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
1e5e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1e5f0 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
1e600 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1e610 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1e620 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e  DR(pNeedSync)->n
1e630 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1e640 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1e650 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75  NeedSync)->inJou
1e660 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41  rnal = 1;.    DA
1e670 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
1e680 64 53 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20  dSync)->dirty = 
1e690 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  1;.    sqlite3pa
1e6a0 67 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53  ger_unref(pNeedS
1e6b0 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ync);.  }..  ret
1e6c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e6d0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1e6e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1e6f0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1e700 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1e710 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
1e720 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1e730 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
1e740 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
1e750 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
1e760 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
1e770 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
1e780 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
1e790 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
1e7a0 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
1e7b0 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
1e7c0 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
1e7d0 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
1e7e0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
1e7f0 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
1e800 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a  (pPager->fd);.}.
1e810 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1e820 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1e830 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
1e840 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
1e850 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
1e860 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
1e870 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1e880 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
1e890 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
1e8a0 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
1e8b0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
1e8c0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
1e8d0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
1e8e0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
1e8f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e900 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1e910 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
1e920 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
1e930 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
1e940 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
1e950 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
1e960 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
1e970 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
1e980 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
1e990 2f 0a                                            /.