/ Hex Artifact Content
Login

Artifact 18c9cb43b3e740c63eaa13da41c52926012e4853:


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 37  : pager.c,v 1.27
0350: 36 20 32 30 30 36 2f 31 31 2f 32 33 20 31 31 3a  6 2006/11/23 11:
0360: 35 38 3a 34 34 20 64 72 68 20 45 78 70 20 24 0a  58:44 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 2c 20 2a 70 50 72 65 76 44 69 72 74 79  rty, *pPrevDirty
1c20: 3b 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61  ;    /* Dirty pa
1c30: 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 6f 74  ges */.  u32 not
1c40: 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
1c50: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1c60: 72 20 73 70 61 63 65 20 2a 2f 0a 23 69 66 64 65  r space */.#ifde
1c70: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1c80: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
1c90: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ash;.#endif.  /*
1ca0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1cb0: 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  e bytes of page 
1cc0: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
1cd0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
1ce0: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
1cf0: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
1d00: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
1d10: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
1d20: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
1d30: 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73  ory only databas
1d40: 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e  e, some extra in
1d50: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63  formation is rec
1d60: 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65  orded about.** e
1d70: 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74  ach page so that
1d80: 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20   changes can be 
1d90: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a  rolled back.  (J
1da0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
1db0: 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72   not.** used for
1dc0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1dd0: 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c  ases.)  The foll
1de0: 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  owing informatio
1df0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  n is added to.**
1e00: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
1e10: 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f  y EXTRA block fo
1e20: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
1e30: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bases..**.** Thi
1e40: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f  s information co
1e50: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64  uld have been ad
1e60: 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ded directly to 
1e70: 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74  the PgHdr struct
1e80: 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e  ure..** But then
1e90: 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75   it would take u
1ea0: 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74  p an extra 8 byt
1eb0: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e  es of storage on
1ec0: 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20   every PgHdr.** 
1ed0: 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61  even for disk-ba
1ee0: 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  sed databases.  
1ef0: 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74  Splitting it out
1f00: 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20   saves 8 bytes. 
1f10: 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
1f20: 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e   a savings of 0.
1f30: 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72  8% but those per
1f40: 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e  centages add up.
1f50: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1f60: 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48  ct PgHistory PgH
1f70: 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50  istory;.struct P
1f80: 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20  gHistory {.  u8 
1f90: 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f  *pOrig;     /* O
1fa0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78  riginal page tex
1fb0: 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74  t.  Restore to t
1fc0: 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f  his on a full ro
1fd0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a  llback */.  u8 *
1fe0: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65  pStmt;     /* Te
1ff0: 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20  xt as it was at 
2000: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
2020: 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  tement */.};../*
2030: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
2040: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
2050: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
2060: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
2070: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2080: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
2090: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  C1(P,D,N,X) if( 
20a0: 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20  P->xCodec!=0 ){ 
20b0: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
20c0: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d  decArg,D,N,X); }
20d0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20e0: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
20f0: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f  *)(P->xCodec!=0?
2100: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
2110: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29  decArg,D,N,X):D)
2120: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
2130: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
2140: 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64   /* NO-OP */.# d
2150: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
2160: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29  ,N,X) ((char*)D)
2170: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
2180: 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72  onvert a pointer
2190: 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f   to a PgHdr into
21a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
21b0: 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61  s data.** and ba
21c0: 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65  ck again..*/.#de
21d0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41  fine PGHDR_TO_DA
21e0: 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28  TA(P)  ((void*)(
21f0: 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e  &(P)[1])).#defin
2200: 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  e DATA_TO_PGHDR(
2210: 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29 28  D)  (&((PgHdr*)(
2220: 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65  D))[-1]).#define
2230: 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28   PGHDR_TO_EXTRA(
2240: 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28  G,P) ((void*)&((
2250: 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29 29  char*)(&(G)[1]))
2260: 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d 29  [(P)->pageSize])
2270: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2280: 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c  O_HIST(P,PGR)  \
2290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50  .            ((P
22a0: 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61  gHistory*)&((cha
22b0: 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50  r*)(&(P)[1]))[(P
22c0: 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28 50  GR)->pageSize+(P
22d0: 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f  GR)->nExtra])../
22e0: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
22f0: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
2300: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2310: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2320: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72  ..**.** Pager.er
2330: 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74  rCode may be set
2340: 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   to SQLITE_IOERR
2350: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
2360: 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  , SQLITE_PROTOCO
2370: 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46  L.** or SQLITE_F
2380: 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66  ULL. Once one of
2390: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
23a0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20   errors occurs, 
23b0: 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61  it persists.** a
23c0: 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  nd is returned a
23d0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
23e0: 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65  every major page
23f0: 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65  r API call.  The
2400: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
2410: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
2420: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
2430: 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f  t. It persists o
2440: 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  nly until the.**
2450: 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c   next successful
2460: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72   rollback is per
2470: 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61  formed on the pa
2480: 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c  ger cache. Also,
2490: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
24a0: 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20  does not affect 
24b0: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
24c0: 5f 67 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  _get() and sqlit
24d0: 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29  e3pager_lookup()
24e0: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
24f0: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
2500: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
2510: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
2520: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65  .  u8 journalOpe
2530: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2540: 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2550: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
2560: 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  rs is valid */. 
2570: 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74   u8 journalStart
2580: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
2590: 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f  True if header o
25a0: 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  f journal is syn
25b0: 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ced */.  u8 useJ
25c0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
25d0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
25e0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
25f0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
2600: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2620: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2630: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2640: 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70  s */.  u8 stmtOp
2650: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2660: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2670: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2680: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
2690: 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65  /.  u8 stmtInUse
26a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26b0: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
26c0: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  n a statement su
26d0: 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  btransaction */.
26e0: 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65    u8 stmtAutoope
26f0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
2700: 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e   Open stmt journ
2710: 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75  al when main jou
2720: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f  rnal is opened*/
2730: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2750: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
2760: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
2770: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
2780: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2790: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
27a0: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
27b0: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
27c0: 73 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 5f  ss */.  u8 full_
27d0: 66 73 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  fsync;          
27e0: 20 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c      /* Use F_FUL
27f0: 4c 46 53 59 4e 43 20 77 68 65 6e 20 61 76 61 69  LFSYNC when avai
2800: 6c 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74  lable */.  u8 st
2810: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2820: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
2830: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
2840: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
2850: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2860: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2870: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
2880: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2890: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
28a0: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
28b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
28c0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
28d0: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
28e0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
28f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2900: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2910: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2920: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2930: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2940: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2950: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
2960: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
2970: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
2980: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
2990: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
29a0: 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70  back() for all p
29b0: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d  ages */.  u8 mem
29c0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
29d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
29e0: 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c   inhibit all fil
29f0: 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65  e I/O */.  u8 se
2a00: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2a10: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2a20: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
2a30: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2a40: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   jrnl */.  int e
2a50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
2a60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2a70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
2a80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
2a90: 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  t dbSize;       
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ab0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ac0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
2ad0: 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20  t origDbSize;   
2ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
2af0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
2b00: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f  urrent change */
2b10: 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b  .  int stmtSize;
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b30: 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61  * Size of databa
2b40: 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74  se (in pages) at
2b50: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
2b60: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2b90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
2ba0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
2bb0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
2bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
2bd0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
2be0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
2bf0: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74  hecksum */.  int
2c00: 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20   stmtNRec;      
2c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c20: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
2c30: 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c   stmt subjournal
2c40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c60: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
2c70: 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68  ny bytes to each
2c80: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2c90: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
2ca0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2cb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2cc0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
2cd0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cf0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2d00: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2d10: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50  s */.  int nMaxP
2d20: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2d30: 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72     /* High water
2d40: 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a   mark of nPage *
2d50: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  /* Number of in-
2d80: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74  memory pages wit
2d90: 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a  h PgHdr.nRef>0 *
2da0: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2dd0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
2de0: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
2df0: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e10: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2e20: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2e30: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2e40: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e60: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2e70: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2e80: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
2e90: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
2ea0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2eb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ec0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
2ed0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2ee0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2ef0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
2f10: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
2f20: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
2f30: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
2f40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2f50: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a  .  OsFile *fd, *
2f60: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  jfd;           /
2f70: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2f80: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
2f90: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
2fa0: 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20 20   OsFile *stfd;  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fc0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2fd0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
2fe0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20  t subjournal*/. 
2ff0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
3000: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
3010: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
3020: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
3030: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
3040: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
3050: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
3060: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
3070: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
3080: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
3090: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
30a0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
30b0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
30c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30d0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
30e0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
30f0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
3100: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3110: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
3120: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
3130: 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  nal */.  PgHdr *
3140: 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20  pDirty;         
3150: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3160: 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
3170: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
3180: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3190: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
31a0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
31b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
31c0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31e0: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
31f0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
3200: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
3210: 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20  stmtHdrOff;     
3220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3230: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3240: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
3250: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  tement */.  i64 
3260: 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20  stmtCksum;      
3270: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
3280: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
3290: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
32a0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69  */.  i64 stmtJSi
32b0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
32c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
32d0: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
32e0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63  n() */.  int sec
32f0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
3300: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
3310: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
3320: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23  ng rollback */.#
3330: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3340: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
3350: 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20  iss, nOvfl;     
3360: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d  /* Cache hits, m
3370: 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20  issing, and LRU 
3380: 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 69  overflows */.  i
3390: 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65 3b  nt nRead,nWrite;
33a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
33b0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
33c0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
33d0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  dif.  void (*xDe
33e0: 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 2c  structor)(void*,
33f0: 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  int); /* Call th
3400: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
3410: 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f  freeing pages */
3420: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
3430: 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b  ter)(void*,int);
3440: 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20     /* Call this 
3450: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
3460: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
3470: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
3480: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3490: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
34a0: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
34b0: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
34c0: 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20  id *pCodecArg;  
34d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
34e0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
34f0: 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 69 6e 74  Codec() */.  int
3500: 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20   nHash;         
3510: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
3520: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
3530: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  sh table */.  Pg
3540: 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20  Hdr **aHash;    
3550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
3560: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
3570: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
3580: 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Hdr */.#ifdef SQ
3590: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
35a0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
35b0: 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20  Pager *pNext;   
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
35d0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
35e0: 67 65 72 73 20 69 6e 20 74 68 69 73 20 74 68 72  gers in this thr
35f0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ead */.#endif.};
3600: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
3610: 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65  E_TEST is define
3620: 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  d then increment
3630: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 67 69   the variable gi
3640: 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72  ven in.** the ar
3650: 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66  gument.*/.#ifdef
3660: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64   SQLITE_TEST.# d
3670: 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28  efine TEST_INCR(
3680: 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20  x)  x++.#else.# 
3690: 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52  define TEST_INCR
36a0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
36b0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
36c0: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
36d0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
36e0: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
36f0: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
3700: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
3710: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
3720: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
3730: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
3740: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
3750: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
3760: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
3770: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
3780: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
3790: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
37a0: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
37b0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
37c0: 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74  s begin.** writt
37d0: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
37e0: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
37f0: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
3800: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
3810: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
3820: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
3830: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
3840: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
3850: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
3860: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
3870: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
3880: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
3890: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
38a0: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
38b0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
38c0: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
38d0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
38e0: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
38f0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
3900: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
3910: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
3920: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
3930: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
3940: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
3950: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
3960: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
3970: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
3980: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
3990: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
39a0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
39b0: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
39c0: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
39d0: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
39e0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
39f0: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
3a00: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
3a10: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3a20: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
3a30: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
3a40: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
3a50: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
3a60: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
3a70: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
3a80: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
3a90: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
3aa0: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
3ab0: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
3ac0: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
3ad0: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
3ae0: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
3af0: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
3b00: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
3b10: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
3b20: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
3b30: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
3b40: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
3b50: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
3b60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
3b70: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
3b80: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
3b90: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
3ba0: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
3bb0: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
3bc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
3bd0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
3be0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
3bf0: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
3c00: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
3c10: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
3c20: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
3c30: 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
3c40: 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70  er and of each p
3c50: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
3c60: 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  al is determined
3c70: 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f  .** by the follo
3c80: 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  wing macros..*/.
3c90: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3ca0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
3cb0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
3cc0: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
3cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
3ce0: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
3cf0: 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75  pager. In the fu
3d00: 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64  ture, this could
3d10: 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f   be.** set to so
3d20: 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  me value read fr
3d30: 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74  om the disk cont
3d40: 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f  roller. The impo
3d50: 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74  rtant.** charact
3d60: 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20  eristic is that 
3d70: 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73  it is the same s
3d80: 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65  ize as a disk se
3d90: 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ctor..*/.#define
3da0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
3db0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
3dc0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
3dd0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
3de0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
3df0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
3e00: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
3e10: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
3e20: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
3e30: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
3e40: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
3e50: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
3e60: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
3e70: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
3e80: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
3e90: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
3ea0: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
3eb0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
3ec0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
3ed0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
3ee0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
3ef0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
3f00: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
3f10: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
3f20: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
3f30: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
3f40: 73 69 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73  size of a disk s
3f50: 65 63 74 6f 72 0a 2a 2f 0a 23 69 66 6e 64 65 66  ector.*/.#ifndef
3f60: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
3f70: 5a 45 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  ZE.# define PAGE
3f80: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35 31  R_SECTOR_SIZE 51
3f90: 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  2.#endif../*.** 
3fa0: 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45  Page number PAGE
3fb0: 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76  R_MJ_PGNO is nev
3fc0: 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51  er used in an SQ
3fd0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69  Lite database (i
3fe0: 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64  t is.** reserved
3ff0: 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f   for working aro
4000: 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f  und a windows/po
4010: 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c  six incompatibil
4020: 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75  ity). It is.** u
4030: 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  sed in the journ
4040: 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  al to signify th
4050: 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  at the remainder
4060: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4070: 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f  file .** is devo
4080: 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61  ted to storing a
4090: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
40a0: 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65  name - there are
40b0: 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74   no more pages t
40c0: 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  o.** roll back. 
40d0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72  See comments for
40e0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d   function writeM
40f0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
4100: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f  or details..*/./
4110: 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  * #define PAGER_
4120: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44  MJ_PGNO(x) (PEND
4130: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
4140: 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65  ageSize)) */.#de
4150: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
4160: 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f  NO(x) ((PENDING_
4170: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
4180: 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  ize))+1)../*.** 
4190: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  The maximum lega
41a0: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  l page number is
41b0: 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a   (2^31 - 1)..*/.
41c0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41  #define PAGER_MA
41d0: 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34  X_PGNO 214748364
41e0: 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  7../*.** Enable 
41f0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
4200: 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65  tracking (for de
4210: 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a  bugging) here:.*
4220: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4230: 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72  TEST.  int pager
4240: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
4250: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
4260: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
4270: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
4280: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
4290: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
42a0: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
42b0: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
42c0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
42d0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45  intf(.       "RE
42e0: 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25  FCNT: %4d addr=%
42f0: 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20  p nRef=%d\n",.  
4300: 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47       p->pgno, PG
4310: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
4320: 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20  p->nRef.    );. 
4330: 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53     cnt++;   /* S
4340: 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20  omething to set 
4350: 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20  a breakpoint on 
4360: 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20  */.  }.# define 
4370: 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65  REFINFO(X)  page
4380: 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c  r_refinfo(X).#el
4390: 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49  se.# define REFI
43a0: 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 0a  NFO(X).#endif...
43b0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
43c0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
43d0: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  er hash table to
43e0: 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61   N.  N must be a
43f0: 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f   power.** of two
4400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4410: 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61   pager_resize_ha
4420: 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a  sh_table(Pager *
4430: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a  pPager, int N){.
4440: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c    PgHdr **aHash,
4450: 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28   *pPg;.  assert(
4460: 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29   N>0 && (N&(N-1)
4470: 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20  )==0 );.  aHash 
4480: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4490: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
44a0: 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73  *N );.  if( aHas
44b0: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
44c0: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
44d0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
44e0: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
44f0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
4500: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
4510: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
4520: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
4530: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  .  pPager->nHash
4540: 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = N;.  pPager->
4550: 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20  aHash = aHash;. 
4560: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
4570: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
4580: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
4590: 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69      int h;.    i
45a0: 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
45b0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
45c0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d   pPg->pNextHash=
45d0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76  =0 && pPg->pPrev
45e0: 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
45f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
4600: 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67  .    h = pPg->pg
4610: 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20  no & (N-1);.    
4620: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
4630: 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69   aHash[h];.    i
4640: 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  f( aHash[h] ){. 
4650: 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70       aHash[h]->p
4660: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
4670: 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b      }.    aHash[
4680: 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50  h] = pPg;.    pP
4690: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
46a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
46b0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
46c0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
46d0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
46e0: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
46f0: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
4700: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
4710: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4720: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
4730: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
4740: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
4750: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
4760: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
4770: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
4780: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
4790: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
47a0: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
47b0: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
47c0: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
47d0: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
47e0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
47f0: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
4800: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a  c, sizeof(ac));.
4810: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4820: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
4830: 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c   = (ac[0]<<24) |
4840: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
4850: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
4860: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
4870: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
4880: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
4890: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ger into a strin
48a0: 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d  g buffer in big-
48b0: 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65  endian byte orde
48c0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
48d0: 64 20 70 75 74 33 32 62 69 74 73 28 63 68 61 72  d put32bits(char
48e0: 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a   *ac, u32 val){.
48f0: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
4900: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
4910: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
4920: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
4930: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
4940: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
4950: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
4960: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
4970: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
4980: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4990: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
49a0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
49b0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
49c0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
49d0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
49e0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
49f0: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
4a00: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
4a10: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
4a20: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
4a30: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
4a40: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
4a50: 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a  d, ac, 4);.}../*
4a60: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
4a70: 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  t integer at off
4a80: 73 65 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f  set 'offset' fro
4a90: 6d 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  m the page ident
4aa0: 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65  ified by.** page
4ab0: 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a   header 'p'..*/.
4ac0: 73 74 61 74 69 63 20 75 33 32 20 72 65 74 72 69  static u32 retri
4ad0: 65 76 65 33 32 62 69 74 73 28 50 67 48 64 72 20  eve32bits(PgHdr 
4ae0: 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b  *p, int offset){
4af0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4b00: 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28   *ac;.  ac = &((
4b10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50  unsigned char*)P
4b20: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29  GHDR_TO_DATA(p))
4b30: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75  [offset];.  retu
4b40: 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c  rn (ac[0]<<24) |
4b50: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
4b60: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
4b70: 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ];.}.../*.** Thi
4b80: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
4b90: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
4ba0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
4bb0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
4bc0: 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66  r.** code. The f
4bd0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
4be0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4bf0: 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
4c00: 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  e, the.** second
4c10: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
4c20: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
4c30: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
4c40: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  API function. .*
4c50: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
4c60: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
4c70: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
4c80: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
4c90: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
4ca0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
4cb0: 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
4cc0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
4cd0: 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f  RRUPT or SQLITE_
4ce0: 50 52 4f 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65  PROTOCOL,.** the
4cf0: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
4d00: 65 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73  ersistent. All s
4d10: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
4d20: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
4d30: 72 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69  r.** will immedi
4d40: 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65  ately return the
4d50: 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   same error code
4d60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4d70: 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
4d80: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
4d90: 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
4da0: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
4db0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
4dc0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
4dd0: 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  L || pPager->err
4de0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
4df0: 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 72 63  );.  if( .    rc
4e00: 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
4e10: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
4e20: 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72  E_IOERR ||.    r
4e30: 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  c2==SQLITE_CORRU
4e40: 50 54 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  PT ||.    rc2==S
4e50: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20  QLITE_PROTOCOL. 
4e60: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
4e70: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
4e80: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4e90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
4ea0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
4eb0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
4ec0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
4ed0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
4ee0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
4ef0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
4f00: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
4f10: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
4f20: 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e   int i;.  unsign
4f30: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d  ed char *pData =
4f40: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
4f50: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
4f60: 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d  pPage);.  for(i=
4f70: 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67  0; i<pPage->pPag
4f80: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b  er->pageSize; i+
4f90: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
4fa0: 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d  hash+i)^pData[i]
4fb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
4fc0: 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ash;.}../*.** Th
4fd0: 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63  e CHECK_PAGE mac
4fe0: 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72  ro takes a PgHdr
4ff0: 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
5000: 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  . If SQLITE_CHEC
5010: 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65  K_PAGES.** is de
5020: 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55  fined, and NDEBU
5030: 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
5040: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  , an assert() st
5050: 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a  atement checks.*
5060: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
5070: 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20  is either dirty 
5080: 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73  or still matches
5090: 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20   the calculated 
50a0: 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64  page-hash..*/.#d
50b0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
50c0: 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29  (x) checkPage(x)
50d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
50e0: 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  ckPage(PgHdr *pP
50f0: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
5100: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
5110: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  r;.  assert( !pP
5120: 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70  g->pageHash || p
5130: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
5140: 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e  | MEMDB || pPg->
5150: 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20  dirty || .      
5160: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
5170: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
5180: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
5190: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
51a0: 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(x).#endif../*.
51b0: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
51c0: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
51d0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
51e0: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
51f0: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61   open..** The ma
5200: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5210: 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66  e name is read f
5220: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
5230: 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  he file and .** 
5240: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
5250: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
5260: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
5270: 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a  . *pzMaster is.*
5280: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61  * set to point a
5290: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64  t the memory and
52a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
52b0: 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
52c0: 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72  must.** sqliteFr
52d0: 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a  ee() *pzMaster..
52e0: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74  **.** If no mast
52f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
5300: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
5310: 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74  *pzMaster is set
5320: 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c   to 0 and.** SQL
5330: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
5340: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5350: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
5360: 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20  (OsFile *pJrnl, 
5370: 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29  char **pzMaster)
5380: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  {.  int rc;.  u3
5390: 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a  2 len;.  i64 szJ
53a0: 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20  ;.  u32 cksum;. 
53b0: 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e   int i;.  unsign
53c0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
53d0: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
53e0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
53f0: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70   header */..  *p
5400: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  zMaster = 0;..  
5410: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
5420: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
5430: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
5440: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c  QLITE_OK || szJ<
5450: 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  16 ) return rc;.
5460: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5470: 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a  sSeek(pJrnl, szJ
5480: 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  -16);.  if( rc!=
5490: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
54a0: 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20  rn rc;. .  rc = 
54b0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
54c0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  , &len);.  if( r
54d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
54e0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
54f0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
5500: 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69  nl, &cksum);.  i
5510: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5520: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5530: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
5540: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
5550: 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21  c, 8);.  if( rc!
5560: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65  =SQLITE_OK || me
5570: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
5580: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
5590: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
55a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
55b0: 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d  k(pJrnl, szJ-16-
55c0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
55d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
55e0: 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73  rn rc;..  *pzMas
55f0: 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ter = (char *)sq
5600: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31  liteMalloc(len+1
5610: 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73  );.  if( !*pzMas
5620: 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ter ){.    retur
5630: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5640: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
5650: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
5660: 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b  *pzMaster, len);
5670: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5680: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
5690: 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72  teFree(*pzMaster
56a0: 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72  );.    *pzMaster
56b0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
56c0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
56d0: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
56e0: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
56f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5700: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  me */.  for(i=0;
5710: 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20   i<len; i++){.  
5720: 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d    cksum -= (*pzM
5730: 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20  aster)[i];.  }. 
5740: 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20   if( cksum ){.  
5750: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63    /* If the chec
5760: 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64  ksum doesn't add
5770: 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72   up, then one or
5780: 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73   more of the dis
5790: 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a  k sectors.    **
57a0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
57b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
57c0: 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75  ilename is corru
57d0: 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73  pted. This means
57e0: 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65  .    ** definite
57f0: 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f  ly roll back, so
5800: 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
5810: 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72  ITE_OK and repor
5820: 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a  t a (nul).    **
5830: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5840: 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f  filename..    */
5850: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
5860: 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  *pzMaster);.    
5870: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  *pzMaster = 0;. 
5880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a   }else{.    (*pz
5890: 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27  Master)[len] = '
58a0: 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72  \0';.  }.   .  r
58b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
58c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
58d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
58e0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
58f0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
5900: 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a  undary where a.*
5910: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
5920: 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20   may be read or 
5930: 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a  written. Pager.j
5940: 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64  ournalOff is upd
5950: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
5960: 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74   new seek offset
5970: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
5980: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
5990: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75   512:.**.** Inpu
59a0: 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20  t Offset        
59b0: 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66        Output Off
59c0: 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  set.** ---------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
59f0: 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  * 0             
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
5a10: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
5a20: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
5a30: 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20  * 100           
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
5a50: 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20  ** 2000         
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
5a70: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
5a80: 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  int seekJournalH
5a90: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5aa0: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
5ab0: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
5ac0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5ad0: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
5ae0: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
5af0: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
5b00: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
5b10: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5b20: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
5b30: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
5b40: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5b50: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
5b60: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
5b70: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
5b80: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
5b90: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
5ba0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5bb0: 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20  lOff = offset;. 
5bc0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
5bd0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
5be0: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
5bf0: 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  alOff);.}../*.**
5c00: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
5c10: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
5c20: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
5c30: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
5c40: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
5c50: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
5c60: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
5c70: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
5c80: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
5c90: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
5ca0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
5cb0: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
5cc0: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
5cd0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
5ce0: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
5cf0: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
5d00: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
5d10: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
5d20: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
5d30: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
5d40: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
5d50: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
5d60: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
5d70: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
5d80: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
5d90: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
5da0: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
5db0: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
5dc0: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
5dd0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
5de0: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
5df0: 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  l..** .** Follow
5e00: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
5e10: 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65  DR_SZ - 24) byte
5e20: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
5e30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5e40: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
5e50: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
5e60: 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b  .  char zHeader[
5e70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
5e80: 61 67 69 63 29 2b 31 36 5d 3b 0a 0a 20 20 69 6e  agic)+16];..  in
5e90: 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e  t rc = seekJourn
5ea0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
5eb0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
5ec0: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
5ed0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
5ee0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5ef0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
5f00: 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a  tmtHdrOff==0 ){.
5f10: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
5f20: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
5f30: 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d  >journalHdr;.  }
5f40: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
5f50: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
5f60: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5f70: 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a  ..  /* FIX ME: .
5f80: 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62    **.  ** Possib
5f90: 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e  ly for a pager n
5fa0: 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ot in no-sync mo
5fb0: 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
5fc0: 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74  magic should not
5fd0: 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
5fe0: 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66   until nRec is f
5ff0: 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74  illed in as part
6000: 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75   of next syncJou
6010: 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20  rnal(). .  **.  
6020: 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62  ** Actually mayb
6030: 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  e the whole jour
6040: 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c  nal header shoul
6050: 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74  d be delayed unt
6060: 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69  il that.  ** poi
6070: 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  nt. Think about 
6080: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  this..  */.  mem
6090: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
60a0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
60b0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
60c0: 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65  ));.  /* The nRe
60d0: 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46  c Field. 0xFFFFF
60e0: 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20  FFF for no-sync 
60f0: 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70  journals. */.  p
6100: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6110: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6120: 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
6130: 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66  ->noSync ? 0xfff
6140: 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a  fffff : 0);.  /*
6150: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
6160: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
6170: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
6180: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
6190: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
61a0: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
61b0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
61c0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
61d0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
61e0: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
61f0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6200: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
6210: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
6220: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6230: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
6240: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
6250: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
6260: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
6270: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
6280: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
6290: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
62a0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
62b0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
62c0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
62d0: 69 7a 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ize);.  rc = sql
62e0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
62f0: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
6300: 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
6310: 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f  ));..  /* The jo
6320: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73  urnal header has
6330: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75   been written su
6340: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b  ccessfully. Seek
6350: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
6360: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
6370: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
6380: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
6390: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a  er sector..  */.
63a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
63b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
63c0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
63d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
63e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29  r->journalOff-1)
63f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
6400: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6410: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
6420: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
6430: 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20  , "\000", 1);.  
6440: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6450: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
6460: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
6470: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
6480: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
6490: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
64a0: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
64b0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
64c0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
64d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
64e0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
64f0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63  l.** file. See c
6500: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
6510: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
6520: 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64  nalHdr() for a d
6530: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
6540: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
6550: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
6560: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
6570: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
6580: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
6590: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
65a0: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
65b0: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
65c0: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
65d0: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
65e0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
65f0: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
6600: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
6610: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
6620: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
6630: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
6640: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
6650: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
6660: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
6670: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
6680: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
6690: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
66a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
66b0: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
66c0: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
66d0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
66e0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
66f0: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
6700: 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20  ze are not set. 
6710: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
6720: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
6730: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
6740: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6750: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
6760: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
6770: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
6780: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
6790: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
67a0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
67b0: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
67c0: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
67d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
67e0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
67f0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
6800: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
6810: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
6820: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
6830: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
6840: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6850: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
6860: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
6870: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6880: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
6890: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
68a0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
68b0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
68c0: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
68d0: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
68e0: 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69  of(aMagic));.  i
68f0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6900: 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  c;..  if( memcmp
6910: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
6920: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
6930: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
6940: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6950: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
6960: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6970: 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29  ger->jfd, pNRec)
6980: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6990: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
69a0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
69b0: 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
69c0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
69d0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
69e0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
69f0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
6a00: 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69  d, pDbSize);.  i
6a10: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6a20: 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  c;..  /* Update 
6a30: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
6a40: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
6a50: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
6a60: 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f  by .  ** the pro
6a70: 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65  cess that create
6a80: 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20  d this journal. 
6a90: 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  If this journal 
6aa0: 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  was.  ** created
6ab0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
6ac0: 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
6ad0: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
6ae0: 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69  tine.  ** is bei
6af0: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
6b00: 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  ithin pager_play
6b10: 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61  back(). The loca
6b20: 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20  l value.  ** of 
6b30: 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
6b40: 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
6b50: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
6b60: 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  routine..  */.  
6b70: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6b80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33  pPager->jfd, (u3
6b90: 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63  2 *)&pPager->sec
6ba0: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
6bb0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6bc0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6bd0: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
6be0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
6bf0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
6c00: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
6c10: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
6c20: 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e  alOff);.  return
6c30: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
6c40: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
6c50: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
6c60: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
6c70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
6c80: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
6c90: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
6ca0: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
6cb0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6cc0: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
6cd0: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
6ce0: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
6cf0: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
6d00: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
6d10: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
6d20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
6d30: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
6d40: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
6d50: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
6d60: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
6d70: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
6d80: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
6d90: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
6da0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
6db0: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
6dc0: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
6dd0: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
6de0: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
6df0: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
6e00: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
6e10: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
6e20: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
6e30: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
6e40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
6e50: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
6e60: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
6e70: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
6e80: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
6e90: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  me..**.** If zMa
6ea0: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
6eb0: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
6ec0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
6ed0: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
6ee0: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
6ef0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
6f00: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
6f10: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
6f20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
6f30: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
6f40: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
6f50: 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69  nt len; .  int i
6f60: 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ; .  u32 cksum =
6f70: 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
6f80: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6f90: 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69  agic)+2*4];..  i
6fa0: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
6fb0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
6fc0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6fd0: 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  OK;.  pPager->se
6fe0: 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20  tMaster = 1;..  
6ff0: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61  len = strlen(zMa
7000: 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ster);.  for(i=0
7010: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
7020: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
7030: 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  ter[i];.  }..  /
7040: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
7050: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
7060: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
7070: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
7080: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
7090: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
70a0: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
70b0: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
70c0: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
70d0: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
70e0: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
70f0: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
7100: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
7110: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
7120: 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  c = seekJournalH
7130: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
7140: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7150: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
7160: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
7170: 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b  rnalOff += (len+
7180: 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  20);..  rc = wri
7190: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
71a0: 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  >jfd, PAGER_MJ_P
71b0: 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20  GNO(pPager));.  
71c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
71d0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
71e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
71f0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
7200: 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29  d, zMaster, len)
7210: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7220: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
7230: 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28  c;..  put32bits(
7240: 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75  zBuf, len);.  pu
7250: 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d  t32bits(&zBuf[4]
7260: 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63  , cksum);.  memc
7270: 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f  py(&zBuf[8], aJo
7280: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7290: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
72a0: 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
72b0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
72c0: 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73  ->jfd, zBuf, 8+s
72d0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
72e0: 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  gic));.  pPager-
72f0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
7300: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72  ger->noSync;.  r
7310: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7320: 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65  ** Add or remove
7330: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
7340: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
7350: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  es that are in t
7360: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
7370: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
7380: 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61  he Pager keeps a
7390: 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f   separate list o
73a0: 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  f pages that are
73b0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a   currently in.**
73c0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
73d0: 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65  ournal.  This he
73e0: 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 70  lps the sqlite3p
73f0: 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
7400: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75  ().** routine ru
7410: 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f  n MUCH faster fo
7420: 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
7430: 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72  e where there ar
7440: 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20  e many.** pages 
7450: 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e  in memory but on
7460: 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20  ly a few are in 
7470: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
7480: 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
7490: 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74   void page_add_t
74a0: 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  o_stmt_list(PgHd
74b0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
74c0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
74d0: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
74e0: 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75  g->inStmt ) retu
74f0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rn;.  assert( pP
7500: 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20  g->pPrevStmt==0 
7510: 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  && pPg->pNextStm
7520: 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  t==0 );.  pPg->p
7530: 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20  PrevStmt = 0;.  
7540: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  if( pPager->pStm
7550: 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  t ){.    pPager-
7560: 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  >pStmt->pPrevStm
7570: 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  t = pPg;.  }.  p
7580: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
7590: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20  pPager->pStmt;. 
75a0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
75b0: 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53   pPg;.  pPg->inS
75c0: 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69  tmt = 1;.}.stati
75d0: 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f  c void page_remo
75e0: 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
75f0: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
7600: 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d   if( !pPg->inStm
7610: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  t ) return;.  if
7620: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
7630: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7640: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e  pPg->pPrevStmt->
7650: 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29  pNextStmt==pPg )
7660: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
7670: 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Stmt->pNextStmt 
7680: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
7690: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
76a0: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
76b0: 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29  er->pStmt==pPg )
76c0: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
76d0: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e  r->pStmt = pPg->
76e0: 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20  pNextStmt;.  }. 
76f0: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53   if( pPg->pNextS
7700: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
7710: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  t( pPg->pNextStm
7720: 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50  t->pPrevStmt==pP
7730: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  g );.    pPg->pN
7740: 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  extStmt->pPrevSt
7750: 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53  mt = pPg->pPrevS
7760: 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  tmt;.  }.  pPg->
7770: 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
7780: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
7790: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74  = 0;.  pPg->inSt
77a0: 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mt = 0;.}../*.**
77b0: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
77c0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
77d0: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
77e0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
77f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7800: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
7810: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
7820: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
7830: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
7840: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
7850: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
7860: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7870: 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72  aHash==0 ) retur
7880: 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65  n 0;.  p = pPage
7890: 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20  r->aHash[pgno & 
78a0: 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
78b0: 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26  )];.  while( p &
78c0: 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20  & p->pgno!=pgno 
78d0: 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  ){.    p = p->pN
78e0: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72  extHash;.  }.  r
78f0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
7900: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
7910: 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20  abase and clear 
7920: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
7930: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
7940: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
7950: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
7960: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
7970: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
7980: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
7990: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
79a0: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
79b0: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
79c0: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
79d0: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
79e0: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
79f0: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
7a00: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
7a10: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
7a20: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
7a30: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
7a40: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
7a50: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
7a60: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
7a70: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
7a80: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
7a90: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
7aa0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
7ab0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
7ac0: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61  (pPg);.  }.  pPa
7ad0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
7ae0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
7af0: 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70  tSynced = 0;.  p
7b00: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
7b10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  ;.  pPager->pAll
7b20: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7b30: 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c  nHash = 0;.  sql
7b40: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
7b50: 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72  aHash);.  pPager
7b60: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70  ->nPage = 0;.  p
7b70: 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30  Pager->aHash = 0
7b80: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7b90: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
7ba0: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
7bb0: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
7bc0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
7bd0: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
7be0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
7bf0: 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72  _LOCK);.  pPager
7c00: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
7c10: 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72  UNLOCK;.  pPager
7c20: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
7c30: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
7c40: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
7c50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7c60: 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
7c70: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
7c80: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
7c90: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
7ca0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
7cb0: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
7cc0: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
7cd0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
7ce0: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
7cf0: 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20  ine releases.** 
7d00: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
7d10: 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  k and acquires a
7d20: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20   SHARED lock in 
7d30: 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20  its place.  The 
7d40: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
7d50: 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63  is deleted and c
7d60: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  losed..**.** TOD
7d70: 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70  O: Consider keep
7d80: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
7d90: 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65  file open for te
7da0: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
7db0: 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74  s..** This might
7dc0: 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
7dd0: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  nce improvement 
7de0: 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65  on windows where
7df0: 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69   opening.** a fi
7e00: 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69  le is an expensi
7e10: 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ve operation..*/
7e20: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
7e30: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61  r_unwritelock(Pa
7e40: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7e50: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
7e60: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
7e70: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
7e80: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
7e90: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
7ea0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7eb0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
7ec0: 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
7ed0: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
7ee0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
7ef0: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
7f00: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
7f10: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
7f20: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
7f30: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
7f40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
7f50: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
7f60: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
7f70: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67  ->jfd);.    pPag
7f80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
7f90: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
7fa0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
7fb0: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
7fc0: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
7fd0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
7fe0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
7ff0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
8000: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
8010: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
8020: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
8030: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
8040: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
8050: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
8060: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
8070: 53 79 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66  Sync = 0;.#ifdef
8080: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8090: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
80a0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
80b0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
80c0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
80d0: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
80e0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
80f0: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
8100: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
8110: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8120: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8130: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
8140: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8150: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
8160: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
8170: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
8180: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
8190: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
81a0: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
81b0: 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d  LOCK);.  pPager-
81c0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
81d0: 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d  HARED;.  pPager-
81e0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
81f0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
8200: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
8210: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
8220: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
8230: 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
8240: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 72 65 74  r->pFirst;.  ret
8250: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8260: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
8270: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66  urn a checksum f
8280: 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64  or the page of d
8290: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ata..**.** This 
82a0: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
82b0: 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72  ecksum.  It is r
82c0: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
82d0: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
82e0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
82f0: 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ue and the page 
8300: 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65  number.  We expe
8310: 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a  rimented with.**
8320: 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74   a checksum of t
8330: 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20  he entire data, 
8340: 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75  but that was fou
8350: 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f  nd to be too slo
8360: 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  w..**.** Note th
8370: 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
8380: 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  er is stored at 
8390: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
83a0: 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65   data and.** the
83b0: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f   checksum is sto
83c0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  red at the end. 
83d0: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
83e0: 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a  nt.  If journal.
83f0: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  ** corruption oc
8400: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
8410: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
8420: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65   most likely sce
8430: 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74  nario.** is that
8440: 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
8450: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
8460: 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
8470: 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d  ged.  It is.** m
8480: 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
8490: 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
84a0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
84b0: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
84c0: 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
84d0: 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
84e0: 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
84f0: 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
8500: 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
8510: 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
8520: 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
8530: 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
8540: 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a  f corruption..**
8550: 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e  .** FIX ME:  Con
8560: 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65  sider adding eve
8570: 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29  ry 200th (or so)
8580: 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74   byte of the dat
8590: 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63  a to the.** chec
85a0: 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20  ksum.  That way 
85b0: 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
85c0: 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65   spans 3 or more
85d0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e   disk sectors an
85e0: 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69  d.** only the mi
85f0: 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63  ddle sector is c
8600: 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20  orrupt, we will 
8610: 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61  still have a rea
8620: 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63  sonable.** chanc
8630: 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65  e of failing the
8640: 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68   checksum and th
8650: 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65  us detecting the
8660: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61   problem..*/.sta
8670: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
8680: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
8690: 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
86a0: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
86b0: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
86c0: 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20  Init;.  int i = 
86d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
86e0: 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69  -200;.  while( i
86f0: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
8700: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
8710: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
8720: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
8730: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
8740: 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  laration */.stat
8750: 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61  ic void makeClea
8760: 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a  n(PgHdr*);../*.*
8770: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
8780: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  page from the jo
8790: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65  urnal file opene
87a0: 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  d on file descri
87b0: 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c  ptor.** jfd.  Pl
87c0: 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20  ayback this one 
87d0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75  page..**.** If u
87e0: 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65  seCksum==0 it me
87f0: 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ans this journal
8800: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68   does not use ch
8810: 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73  ecksums.  Checks
8820: 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75  ums.** are not u
8830: 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74  sed in statement
8840: 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73   journals becaus
8850: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
8860: 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e  nals do not.** n
8870: 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70  eed to survive p
8880: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a  ower failures..*
8890: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
88a0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
88b0: 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
88c0: 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c  er, OsFile *jfd,
88d0: 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a   int useCksum){.
88e0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
88f0: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
8900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
8910: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
8920: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
8930: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8950: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
8960: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
8970: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
8980: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
8990: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
89a0: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
89b0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
89c0: 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49  .  u8 aData[SQLI
89d0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
89e0: 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ];  /* Temp stor
89f0: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
8a00: 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d  /..  /* useCksum
8a10: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20   should be true 
8a20: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  for the main jou
8a30: 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66  rnal and false f
8a40: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  or.  ** statemen
8a50: 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72  t journals.  Ver
8a60: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73  ify that this is
8a70: 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
8a80: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
8a90: 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d  jfd == (useCksum
8aa0: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
8ab0: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29   pPager->stfd) )
8ac0: 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  ;...  rc = read3
8ad0: 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f  2bits(jfd, &pgno
8ae0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8af0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
8b00: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
8b10: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61  e3OsRead(jfd, &a
8b20: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
8b30: 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  geSize);.  if( r
8b40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8b50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67  eturn rc;.  pPag
8b60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
8b70: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
8b80: 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61  ze + 4;..  /* Sa
8b90: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
8ba0: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
8bb0: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
8bc0: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
8bd0: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
8be0: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
8bf0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
8c00: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
8c10: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
8c20: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
8c30: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
8c40: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
8c50: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
8c60: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
8c70: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
8c80: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
8c90: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
8ca0: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
8cb0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
8cc0: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
8cd0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
8ce0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
8cf0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
8d00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
8d10: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
8d20: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
8d30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8d40: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43  ;.  }.  if( useC
8d50: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  ksum ){.    rc =
8d60: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
8d70: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
8d80: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
8d90: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
8da0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
8db0: 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73     if( pager_cks
8dc0: 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  um(pPager, aData
8dd0: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
8de0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8df0: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
8e00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8e10: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
8e20: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
8e30: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
8e40: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
8e50: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
8e60: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
8e70: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
8e80: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
8e90: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
8ea0: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
8eb0: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
8ec0: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
8ed0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
8ee0: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
8ef0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
8f00: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
8f10: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
8f20: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
8f30: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
8f40: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
8f50: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
8f60: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
8f70: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
8f80: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
8f90: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
8fa0: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
8fb0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
8fc0: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
8fd0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
8fe0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
8ff0: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
9000: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
9010: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
9020: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
9030: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
9040: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
9050: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
9060: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
9070: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
9080: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
9090: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
90a0: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
90b0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
90c0: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
90d0: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
90e0: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
90f0: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
9100: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
9110: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
9120: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
9130: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
9140: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
9150: 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e   are in the main
9160: 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
9170: 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
9180: 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f  se, if a full RO
9190: 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66  LLBACK occurs af
91a0: 74 65 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ter the statemen
91b0: 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  t.  ** rollback 
91c0: 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43  the full ROLLBAC
91d0: 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f  K will not resto
91e0: 72 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 69  re the page to i
91f0: 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
9200: 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63   content.  Two c
9210: 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
9220: 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  e met before wri
9230: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
9240: 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e  base.  ** files.
9250: 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
9260: 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64  e must be locked
9270: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
9280: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
9290: 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65  .  ** page conte
92a0: 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69  nt is in the mai
92b0: 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
92c0: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
92d0: 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a  e is not in.  **
92e0: 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69   cache or else i
92f0: 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  t is marked as n
9300: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f  eedSync==0..  */
9310: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
9320: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
9330: 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  no);.  assert( p
9340: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
9350: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c  GER_EXCLUSIVE ||
9360: 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 54 52 41   pPg!=0 );.  TRA
9370: 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE3("PLAYBACK %d
9380: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
9390: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
93a0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
93b0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
93c0: 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50  EXCLUSIVE && (pP
93d0: 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65  g==0 || pPg->nee
93e0: 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20  dSync==0) ){.   
93f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
9400: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
9410: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
9420: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9430: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
9440: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9450: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9460: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
9470: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
9480: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
9490: 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
94a0: 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
94b0: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Pg);.    }.  }. 
94c0: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
94d0: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
94e0: 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
94f0: 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
9500: 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
9510: 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
9520: 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
9530: 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
9540: 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
9550: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
9560: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
9570: 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
9580: 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
9590: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
95a0: 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
95b0: 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
95c0: 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
95d0: 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
95e0: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
95f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
9600: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
9610: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
9620: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
9630: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
9640: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20  pPg->pgno==1 ); 
9650: 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50  */.    pData = P
9660: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
9670: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  );.    memcpy(pD
9680: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
9690: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
96a0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
96b0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f  Destructor ){  /
96c0: 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f  *** FIX ME:  Sho
96d0: 75 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69  uld this be xRei
96e0: 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20  nit? ***/.      
96f0: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
9700: 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65  tor(pData, pPage
9710: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9720: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
9730: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
9740: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
9750: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
9760: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
9770: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
9780: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
9790: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
97a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
97b0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
97c0: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
97d0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
97e0: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
97f0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
9800: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
9810: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
9820: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
9830: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
9840: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
9850: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
9860: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
9870: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
9880: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9890: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
98a0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
98b0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
98c0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
98d0: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
98e0: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
98f0: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
9900: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
9910: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
9920: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
9930: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
9940: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
9950: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
9960: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
9970: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
9980: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
9990: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
99a0: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
99b0: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
99c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
99d0: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
99e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61  (const char *zMa
99f0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
9a00: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
9a10: 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65  en = 0;.  OsFile
9a20: 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   *master = 0;.  
9a30: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
9a40: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
9a50: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
9a60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
9a70: 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
9a80: 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
9a90: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
9aa0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
9ab0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
9ac0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9ad0: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
9ae0: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
9af0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
9b00: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
9b10: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
9b20: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
9b30: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
9b40: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
9b50: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
9b60: 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61  nly(zMaster, &ma
9b70: 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ster);.  if( rc!
9b80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
9b90: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
9ba0: 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  .  master_open =
9bb0: 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   1;.  rc = sqlit
9bc0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73  e3OsFileSize(mas
9bd0: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
9be0: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
9bf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
9c00: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
9c10: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
9c20: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
9c30: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
9c40: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
9c50: 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  rPtr = 0;..    /
9c60: 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
9c70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9c80: 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
9c90: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
9ca0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c     ** sqliteMall
9cb0: 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
9cc0: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
9cd0: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20  urnal. .    */. 
9ce0: 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
9cf0: 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  l = (char *)sqli
9d00: 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  teMalloc(nMaster
9d10: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66  Journal);.    if
9d20: 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
9d30: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
9d40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9d50: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
9d60: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
9d70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9d80: 52 65 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61  Read(master, zMa
9d90: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61  sterJournal, nMa
9da0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
9db0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9dc0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
9dd0: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
9de0: 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
9df0: 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
9e00: 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
9e10: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
9e20: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
9e30: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9e40: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
9e50: 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20  Journal) ){.    
9e60: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
9e70: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
9e80: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
9e90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
9ea0: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
9eb0: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
9ec0: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
9ed0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9ee0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
9ef0: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
9f00: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
9f10: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9f20: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
9f30: 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c  */.        OsFil
9f40: 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  e *journal = 0;.
9f50: 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a          int c;..
9f60: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
9f70: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
9f80: 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f  ly(zJournal, &jo
9f90: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
9fa0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9fb0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
9fc0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9fd0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
9fe0: 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
9ff0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75  asterJournal(jou
a000: 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74  rnal, &zMasterPt
a010: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
a020: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72  te3OsClose(&jour
a030: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
a040: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a050: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
a060: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
a070: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
a080: 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
a090: 74 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  tr!=0 && strcmp(
a0a0: 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
a0b0: 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
a0c0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
a0d0: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
a0e0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
a0f0: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
a100: 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
a110: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
a120: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
a130: 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
a140: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a150: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a160: 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  }.      zJournal
a170: 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75   += (strlen(zJou
a180: 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
a190: 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33    }.  .  sqlite3
a1a0: 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72  OsDelete(zMaster
a1b0: 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75  );..delmaster_ou
a1c0: 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72  t:.  if( zMaster
a1d0: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73  Journal ){.    s
a1e0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
a1f0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
a200: 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70  .  if( master_op
a210: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
a220: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72  3OsClose(&master
a230: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
a240: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
a250: 65 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20  e every page in 
a260: 74 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20  the cache agree 
a270: 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20  with what is on 
a280: 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  disk.  In other 
a290: 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64  words,.** reread
a2a0: 20 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73   the disk to res
a2b0: 65 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  et the state of 
a2c0: 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
a2d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
a2e0: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20   called after a 
a2f0: 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63  rollback in whic
a300: 68 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69  h some of the di
a310: 72 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67  rty cache.** pag
a320: 65 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65  es had never bee
a330: 6e 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  n written out to
a340: 20 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20   disk.  We need 
a350: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
a360: 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e  .** cache conten
a370: 74 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73  t and the easies
a380: 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74  t way to do that
a390: 20 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68   is to reread th
a3a0: 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a  e old content.**
a3b0: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64   back from the d
a3c0: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
a3d0: 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f  nt pager_reload_
a3e0: 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
a3f0: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
a400: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
a410: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28  QLITE_OK;.  for(
a420: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
a430: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
a440: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63  pNextAll){.    c
a450: 68 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f  har zBuf[SQLITE_
a460: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a  MAX_PAGE_SIZE];.
a470: 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69      if( !pPg->di
a480: 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rty ) continue;.
a490: 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
a4a0: 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
a4b0: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
a4c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a4d0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
a4e0: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
a4f0: 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d  eSize*(i64)(pPg-
a500: 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20  >pgno-1));.     
a510: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a520: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
a530: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
a540: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
a550: 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
a560: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
a570: 20 20 20 20 54 52 41 43 45 33 28 22 52 45 46 45      TRACE3("REFE
a580: 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e  TCH %d page %d\n
a590: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
a5a0: 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
a5b0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
a5c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45  reak;.      CODE
a5d0: 43 31 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c  C1(pPager, zBuf,
a5e0: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a   pPg->pgno, 2);.
a5f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a600: 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
a610: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a620: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
a630: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
a640: 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50  | memcmp(zBuf, P
a650: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
a660: 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
a670: 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65  ize) ){.      me
a680: 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
a690: 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70  TA(pPg), zBuf, p
a6a0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
a6b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
a6c0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
a6d0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
a6e0: 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52  >xReiniter(PGHDR
a6f0: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
a700: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
a710: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a720: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
a730: 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
a740: 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
a750: 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
a760: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a770: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
a780: 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   0;.    pPg->dir
a790: 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ty = 0;.#ifdef S
a7a0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
a7b0: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
a7c0: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
a7d0: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
a7e0: 66 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  f.  }.  pPager->
a7f0: 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 72 65  pDirty = 0;.  re
a800: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a810: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d  * Truncate the m
a820: 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20  ain file of the 
a830: 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74  given pager to t
a840: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
a850: 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e  es.** indicated.
a860: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a870: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
a880: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
a890: 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
a8a0: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
a8b0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
a8c0: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  E );.  return sq
a8d0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
a8e0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
a8f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
a900: 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  4)nPage);.}../*.
a910: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
a920: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
a930: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
a940: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
a950: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
a960: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
a970: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
a980: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
a990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a9a0: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
a9b0: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
a9c0: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
a9d0: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
a9e0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
a9f0: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
aa00: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
aa10: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
aa20: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
aa30: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
aa40: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
aa50: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
aa60: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
aa70: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
aa80: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
aa90: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
aaa0: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
aab0: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
aac0: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
aad0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
aae0: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
aaf0: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
ab00: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
ab10: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
ab20: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
ab30: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
ab40: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
ab50: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
ab60: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
ab70: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
ab80: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
ab90: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
aba0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
abb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
abc0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
abd0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
abe0: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
abf0: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
ac00: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
ac10: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
ac20: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
ac30: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
ac40: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
ac50: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
ac60: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
ac70: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
ac80: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
ac90: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
aca0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
acb0: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
acc0: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
acd0: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
ace0: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
acf0: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
ad00: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
ad10: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
ad20: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
ad30: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
ad40: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
ad50: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
ad60: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
ad70: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
ad80: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
ad90: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
ada0: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
adb0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
adc0: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
add0: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
ade0: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
adf0: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
ae00: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
ae10: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
ae20: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
ae30: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
ae40: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
ae50: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
ae60: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
ae70: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
ae80: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
ae90: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
aea0: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
aeb0: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
aec0: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
aed0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
aee0: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
aef0: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
af00: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
af10: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
af20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
af30: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
af40: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
af50: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
af60: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
af70: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
af80: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
af90: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
afa0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
afb0: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
afc0: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
afd0: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
afe0: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
aff0: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
b000: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
b010: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
b020: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
b030: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
b040: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
b050: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
b060: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
b070: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
b080: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
b090: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
b0a0: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
b0b0: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
b0c0: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
b0d0: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
b0e0: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
b0f0: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
b100: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
b110: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
b120: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
b130: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
b140: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
b150: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
b160: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
b170: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
b180: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
b190: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
b1a0: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
b1b0: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
b1c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
b1d0: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
b1e0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
b1f0: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
b200: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
b210: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
b220: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
b230: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
b240: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
b250: 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
b260: 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
b270: 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
b280: 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
b290: 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
b2a0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
b2b0: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
b2c0: 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
b2d0: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
b2e0: 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
b2f0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
b300: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
b310: 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
b320: 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
b330: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
b340: 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
b350: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
b360: 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
b370: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
b380: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
b390: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
b3a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
b3b0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
b3c0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
b3d0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
b3e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
b3f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b400: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
b410: 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
b420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b430: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
b440: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
b450: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b470: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
b480: 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
b490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b4a0: 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
b4b0: 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
b4c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b4e0: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
b4f0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
b500: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
b510: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
b520: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
b530: 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
b540: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  y */..  /* Figur
b550: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
b560: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
b570: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
b580: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
b590: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
b5a0: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
b5b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
b5c0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
b5d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
b5e0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
b5f0: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
b600: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b610: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
b620: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
b630: 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
b640: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
b650: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
b660: 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
b670: 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
b680: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
b690: 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
b6a0: 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
b6b0: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
b6c0: 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
b6d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
b6e0: 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
b6f0: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
b700: 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
b710: 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72  k..  */.  rc = r
b720: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
b730: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
b740: 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72  Master);.  asser
b750: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
b760: 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  NE );.  if( rc!=
b770: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d  SQLITE_OK || (zM
b780: 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74 65  aster && !sqlite
b790: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d  3OsFileExists(zM
b7a0: 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73  aster)) ){.    s
b7b0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
b7c0: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
b7d0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  = 0;.    if( rc=
b7e0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
b7f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b800: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
b810: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  back;.  }.  sqli
b820: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
b830: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61  ->jfd, 0);.  pPa
b840: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b850: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
b860: 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
b870: 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20  either when the 
b880: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
b890: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20   call returns.  
b8a0: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ** SQLITE_DONE o
b8b0: 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  r an IO error oc
b8c0: 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65  curs. */.  while
b8d0: 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52  ( 1 ){..    /* R
b8e0: 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
b8f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
b900: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b910: 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
b920: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
b930: 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
b940: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b950: 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
b960: 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
b970: 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
b980: 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
b990: 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65  ss must of faile
b9a0: 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
b9b0: 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
b9c0: 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
b9d0: 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
b9e0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
b9f0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
ba00: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
ba10: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
ba20: 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69  c, &mxPg);.    i
ba30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ba40: 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72   ){ .      if( r
ba50: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
ba60: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
ba70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
ba80: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
ba90: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
baa0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
bab0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
bac0: 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61  then this journa
bad0: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  l was created by
bae0: 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a   a process.    *
baf0: 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d  * working in no-
bb00: 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20  sync mode. This 
bb10: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
bb20: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
bb30: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  al.    ** file c
bb40: 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73  onsists of pages
bb50: 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  , there are no m
bb60: 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ore journal head
bb70: 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20  ers. Compute.   
bb80: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
bb90: 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74   nRec based on t
bba0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a  his assumption..
bbb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
bbc0: 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
bbd0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
bbe0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bbf0: 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
bc00: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
bc10: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
bc20: 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
bc30: 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
bc40: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
bc50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
bc60: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
bc70: 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
bc80: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
bc90: 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
bca0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
bcb0: 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27  file back to it'
bcc0: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
bcd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
bce0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
bcf0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
bd00: 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
bd10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
bd20: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
bd30: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61  ager) ){.      a
bd40: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
bd50: 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20  rigDbSize==0 || 
bd60: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
bd70: 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20  ze==mxPg );.    
bd80: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
bd90: 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
bda0: 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
bdb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
bdc0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
bdd0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
bde0: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
bdf0: 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
be00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
be10: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
be20: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
be30: 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
be40: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
be50: 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
be60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63   for(i=0; i<nRec
be70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
be80: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
be90: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
bea0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
beb0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
bec0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bed0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
bee0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
bef0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
bf00: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
bf10: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bf20: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
bf30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bf50: 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
bf60: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
bf70: 6c 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72  lback a hot jour
bf80: 6e 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 64 61  nal, then the da
bf90: 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 20  tabase.         
bfa0: 20 2a 2a 20 69 73 20 70 72 6f 62 61 62 6c 79 20   ** is probably 
bfb0: 6e 6f 74 20 72 65 63 6f 76 65 72 61 62 6c 65 2e  not recoverable.
bfc0: 20 20 52 65 74 75 72 6e 20 43 4f 52 52 55 50 54    Return CORRUPT
bfd0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
bfe0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
bff0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
c000: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
c010: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
c020: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c030: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
c040: 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
c050: 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
c060: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
c070: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c080: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
c090: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
c0a0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74  .  }.  if( zMast
c0b0: 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  er ){.    /* If 
c0c0: 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
c0d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
c0e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c0f0: 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20   return true,.  
c100: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
c110: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
c120: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
c130: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
c140: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c150: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
c160: 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
c170: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
c180: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
c190: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
c1a0: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
c1b0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
c1c0: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
c1d0: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
c1e0: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
c1f0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
c200: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
c210: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
c220: 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f  nt PAGER_SECTOR_
c230: 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  SIZE.  ** value.
c240: 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
c250: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
c260: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
c270: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
c280: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47  sectorSize = PAG
c290: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  ER_SECTOR_SIZE;.
c2a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c2b0: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
c2c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
c2d0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
c2e0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
c2f0: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
c300: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
c310: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
c320: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
c330: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
c340: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
c350: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
c360: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
c370: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
c380: 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d        the statem
c390: 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ent is stored in
c3a0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
c3b0: 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
c3c0: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
c3d0: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
c3e0: 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
c3f0: 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
c400: 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74  ng back the stat
c410: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61  ement journal, a
c420: 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  lso.**         p
c430: 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65  layback all page
c440: 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  s of the transac
c450: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67  tion journal beg
c460: 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  inning.**       
c470: 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67    at offset pPag
c480: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a  er->stmtJSize..*
c490: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c4a0: 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
c4b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
c4c0: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c4e0: 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  ize of the full 
c4f0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
c500: 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e   hdrOff;.  int n
c510: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
c520: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c530: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
c540: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c550: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c560: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
c570: 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61  rc;..  szJ = pPa
c580: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
c590: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
c5a0: 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f  .  {.    i64 os_
c5b0: 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  szJ;.    rc = sq
c5c0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
c5d0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73  pPager->jfd, &os
c5e0: 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72  _szJ);.    if( r
c5f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
c600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73  eturn rc;.    as
c610: 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a  sert( szJ==os_sz
c620: 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  J );.  }.#endif.
c630: 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
c640: 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
c650: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6a  t to the first j
c660: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
c670: 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20  itten.  ** this 
c680: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
c690: 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65 6e  ction, or the en
c6a0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
c6b0: 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
c6c0: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
c6d0: 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
c6e0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
c6f0: 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
c700: 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
c710: 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
c720: 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
c730: 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
c740: 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  szJ;.  }.  .  /*
c750: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
c760: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
c770: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
c780: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
c790: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
c7a0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
c7b0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
c7c0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
c7d0: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
c7e0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
c7f0: 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
c800: 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a  >stmtSize;..  /*
c810: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
c820: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
c830: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
c840: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
c850: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c860: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70  ->stmtInUse && p
c870: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
c880: 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  en );.  sqlite3O
c890: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74  sSeek(pPager->st
c8a0: 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d  fd, 0);.  nRec =
c8b0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
c8c0: 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
c8d0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
c8e0: 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
c8f0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
c900: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
c910: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
c920: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
c930: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
c940: 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
c950: 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
c960: 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
c970: 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
c980: 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
c990: 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
c9a0: 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
c9b0: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
c9c0: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nRec-1; i>=0; i-
c9d0: 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  -){.    rc = pag
c9e0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
c9f0: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
ca00: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
ca10: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
ca20: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
ca30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ca40: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
ca50: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
ca60: 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c  }..  /* Now roll
ca70: 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b   some pages back
ca80: 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61   from the transa
ca90: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50  ction journal. P
caa0: 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20  ager.stmtJSize. 
cab0: 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65   ** was the size
cac0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
cad0: 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73  file when this s
cae0: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
caf0: 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76  rted, so.  ** ev
cb00: 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74  erything after t
cb10: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
cb20: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74  rolled back, eit
cb30: 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  her into the.  *
cb40: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  * database, the 
cb50: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72  memory cache, or
cb60: 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
cb70: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65   If it is not ze
cb80: 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73  ro, then Pager.s
cb90: 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65  tmtHdrOff is the
cba0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
cbb0: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
cbc0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
cbd0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75  eader written du
cbe0: 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d  ring this statem
cbf0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
cc00: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
cc10: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
cc20: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
cc30: 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
cc40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cc50: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
cc60: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
cc70: 20 7d 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 70 50 61 67 65 72  rnalOff = pPager
cc90: 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70  ->stmtJSize;.  p
cca0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ccb0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43   = pPager->stmtC
ccc0: 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  ksum;.  assert( 
ccd0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
cce0: 50 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e  Pager)<(pPager->
ccf0: 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20  pageSize+8) );. 
cd00: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
cd10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68  journalOff <= (h
cd20: 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70  drOff-(pPager->p
cd30: 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20  ageSize+8)) ){. 
cd40: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
cd50: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
cd60: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
cd70: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  jfd, 1);.    ass
cd80: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
cd90: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
cda0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
cdb0: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
cdc0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77  ayback;.  }..  w
cdd0: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
cde0: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29  urnalOff < szJ )
cdf0: 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b  {.    u32 nJRec;
ce00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ce10: 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
ce20: 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
ce30: 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
ce40: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
ce50: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a  pPager, szJ, &nJ
ce60: 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
ce70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ce80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
ce90: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
cea0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f  DONE );.      go
ceb0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
cec0: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  back;.    }.    
ced0: 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a  if( nJRec==0 ){.
cee0: 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73        nJRec = (s
cef0: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
cf00: 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67  rnalOff) / (pPag
cf10: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b  er->pageSize+8);
cf20: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
cf30: 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26  =nJRec-1; i>=0 &
cf40: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
cf50: 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29  lOff < szJ; i--)
cf60: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
cf70: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
cf80: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
cf90: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
cfa0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
cfb0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
cfc0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
cfd0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
cfe0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
cff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
d000: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d010: 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73   = szJ;.  .end_s
d020: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
d030: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d040: 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K) {.    pPager-
d050: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
d060: 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  J;.    /* pager_
d070: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
d080: 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72  ger); */.  }.  r
d090: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d0a0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
d0b0: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
d0c0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
d0d0: 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
d0e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d0f0: 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65  3pager_set_cache
d100: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
d110: 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
d120: 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30  .  if( mxPage>10
d130: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
d140: 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b  mxPage = mxPage;
d150: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
d160: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
d170: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
d180: 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
d190: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
d1a0: 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
d1b0: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
d1c0: 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
d1d0: 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
d1e0: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
d1f0: 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
d200: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
d210: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
d220: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
d230: 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
d240: 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
d250: 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
d260: 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
d270: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
d280: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
d290: 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
d2a0: 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
d2b0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
d2c0: 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
d2d0: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
d2e0: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
d2f0: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
d310: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
d320: 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
d330: 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
d340: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
d350: 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
d360: 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
d370: 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
d380: 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
d390: 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
d3a0: 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
d3b0: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
d3c0: 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
d3d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d3e0: 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
d3f0: 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
d400: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
d410: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
d420: 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
d430: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
d440: 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
d450: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
d460: 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
d470: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
d480: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
d490: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
d4a0: 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
d4b0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
d4c0: 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
d4d0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
d4e0: 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
d4f0: 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
d500: 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
d510: 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
d520: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
d530: 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
d540: 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
d550: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d560: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
d570: 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
d580: 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
d590: 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
d5a0: 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
d5b0: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
d5c0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
d5d0: 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
d5f0: 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
d600: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
d610: 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
d620: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
d630: 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
d640: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
d650: 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
d660: 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
d670: 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
d680: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d690: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
d6a0: 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  AS.void sqlite3p
d6b0: 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f  ager_set_safety_
d6c0: 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  level(Pager *pPa
d6d0: 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  ger, int level, 
d6e0: 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b  int full_fsync){
d6f0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
d700: 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c  c =  level==1 ||
d710: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
d720: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
d730: 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33  lSync = level==3
d740: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
d750: 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
d760: 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75  >full_fsync = fu
d770: 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20  ll_fsync;.  if( 
d780: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
d790: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
d7a0: 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  c = 0;.}.#endif.
d7b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
d7c0: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
d7d0: 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
d7e0: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
d7f0: 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
d800: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
d810: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
d820: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
d830: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
d840: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
d850: 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
d860: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
d870: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
d880: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
d890: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
d8a0: 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
d8b0: 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  y file.  Write t
d8c0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
d8d0: 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a  ile into zFile.*
d8e0: 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20 62 65  * (zFile must be
d8f0: 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45   at least SQLITE
d900: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62  _TEMPNAME_SIZE b
d910: 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69  ytes long.)  Wri
d920: 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  te.** the file d
d930: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
d940: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
d950: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
d960: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
d970: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
d980: 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54  we fail..**.** T
d990: 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
d9a0: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
d9b0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
d9c0: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  le when it is.**
d9d0: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
d9e0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70 61  ic int sqlite3pa
d9f0: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61  ger_opentemp(cha
da00: 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65  r *zFile, OsFile
da10: 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63   **pFd){.  int c
da20: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
da30: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
da40: 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
da50: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
da60: 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
da70: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
da80: 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
da90: 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d  f.  do{.    cnt-
daa0: 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  -;.    sqlite3Os
dab0: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69  TempFileName(zFi
dac0: 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  le);.    rc = sq
dad0: 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
dae0: 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c  sive(zFile, pFd,
daf0: 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63   1);.  }while( c
db00: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
db10: 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
db20: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
db30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
db40: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
db50: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
db60: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
db70: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
db80: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
db90: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
dba0: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
dbb0: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
dbc0: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
dbd0: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
dbe0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70  call to sqlite3p
dbf0: 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69  ager_get() and i
dc00: 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
dc10: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
dc20: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
dc30: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
dc40: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  3pager_unref()..
dc50: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
dc60: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
dc70: 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
dc80: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
dc90: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
dca0: 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
dcb0: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
dcc0: 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
dcd0: 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
dce0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
dcf0: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
dd00: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
dd10: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
dd20: 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  then all informa
dd30: 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
dd40: 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20  cache..** It is 
dd50: 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
dd60: 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e   disk.  This can
dd70: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
dd80: 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d  ement an.** in-m
dd90: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
dda0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
ddb0: 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65  ger_open(.  Page
ddc0: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
ddd0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
dde0: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
ddf0: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
de00: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
de10: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
de20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
de30: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
de40: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
de50: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
de60: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
de70: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
de80: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
de90: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
dea0: 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
deb0: 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
dec0: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  le */.){.  Pager
ded0: 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20   *pPager = 0;.  
dee0: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
def0: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ame = 0;.  int n
df00: 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70  ameLen;  /* Comp
df10: 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20 54  iler is wrong. T
df20: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 69 6e  his is always in
df30: 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65  itialized before
df40: 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65   use */.  OsFile
df50: 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *fd;.  int rc =
df60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
df70: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
df80: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
df90: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
dfa0: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
dfb0: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
dfc0: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
dfd0: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
dfe0: 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
dff0: 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
e000: 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
e010: 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  !=0;.  char zTem
e020: 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
e030: 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65 66 20  E_SIZE];.#ifdef 
e040: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
e050: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
e060: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
e070: 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73  cannot fail in s
e080: 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
e090: 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  () as one or mor
e0a0: 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a  e calls to .  **
e0b0: 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68   malloc() must h
e0c0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
e0d0: 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74 68   made by this th
e0e0: 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20 67  read before it g
e0f0: 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ets.  ** to this
e100: 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61   point. This mea
e110: 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74  ns the ThreadDat
e120: 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  a must have been
e130: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61   allocated alrea
e140: 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  dy.  ** so that 
e150: 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
e160: 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20 49 74  c can be set. It
e170: 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65 20 74   would be nice t
e180: 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 74 68  o assert.  ** th
e190: 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
e1a0: 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  lloc is non-zero
e1b0: 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69 73 20  , but alas this 
e1c0: 62 72 65 61 6b 73 20 74 65 73 74 20 63 61 73 65  breaks test case
e1d0: 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  s .  ** written 
e1e0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 70 61  to invoke the pa
e1f0: 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  ger directly..  
e200: 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61 20  */.  ThreadData 
e210: 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54  *pTsd = sqlite3T
e220: 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61  hreadData();.  a
e230: 73 73 65 72 74 28 20 70 54 73 64 20 29 3b 0a 23  ssert( pTsd );.#
e240: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 6d  endif..  /* If m
e250: 61 6c 6c 6f 63 28 29 20 68 61 73 20 61 6c 72 65  alloc() has alre
e260: 61 64 79 20 66 61 69 6c 65 64 20 72 65 74 75 72  ady failed retur
e270: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  n SQLITE_NOMEM. 
e280: 42 65 66 6f 72 65 20 65 76 65 6e 0a 20 20 2a 2a  Before even.  **
e290: 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 68 69   testing for thi
e2a0: 73 2c 20 73 65 74 20 2a 70 70 50 61 67 65 72 20  s, set *ppPager 
e2b0: 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 65 20 63  to NULL so the c
e2c0: 61 6c 6c 65 72 20 6b 6e 6f 77 73 20 74 68 65 20  aller knows the 
e2d0: 70 61 67 65 72 0a 20 20 2a 2a 20 73 74 72 75 63  pager.  ** struc
e2e0: 74 75 72 65 20 77 61 73 20 6e 65 76 65 72 20 61  ture was never a
e2f0: 6c 6c 6f 63 61 74 65 64 2e 20 0a 20 20 2a 2f 0a  llocated. .  */.
e300: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
e310: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 6c    if( sqlite3Mal
e320: 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a 20  locFailed() ){. 
e330: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e340: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
e350: 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a  mset(&fd, 0, siz
e360: 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20 2f 2a 20  eof(fd));..  /* 
e370: 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
e380: 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46 75 6c  ile and set zFul
e390: 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69  lPathname to poi
e3a0: 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64  nt at malloc()ed
e3b0: 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f   .  ** memory co
e3c0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d  ntaining the com
e3d0: 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65 20 28  plete filename (
e3e0: 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74  i.e. including t
e3f0: 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0a 20  he directory).. 
e400: 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
e410: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
e420: 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  [0] ){.#ifndef S
e430: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
e440: 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
e450: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
e460: 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
e470: 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
e480: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
e490: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
e4a0: 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73  up("");.    }els
e4b0: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
e4c0: 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61       zFullPathna
e4d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
e4e0: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
e4f0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
e500: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29   zFullPathname )
e510: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
e520: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
e530: 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e  Write(zFullPathn
e540: 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f  ame, &fd, &readO
e550: 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nly);.      }.  
e560: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
e570: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
e580: 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
e590: 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46 69  p, &fd);.    zFi
e5a0: 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a  lename = zTemp;.
e5b0: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
e5c0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
e5d0: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
e5e0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
e5f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e600: 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20       tempFile = 
e610: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
e620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
e630: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
e640: 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   As part of the 
e650: 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  same allocation,
e660: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73   allocate.  ** s
e670: 70 61 63 65 20 66 6f 72 20 74 68 65 20 66 75 6c  pace for the ful
e680: 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65 20 66  l paths of the f
e690: 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79 20 61  ile, directory a
e6a0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  nd journal .  **
e6b0: 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d   (Pager.zFilenam
e6c0: 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74  e, Pager.zDirect
e6d0: 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ory and Pager.zJ
e6e0: 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20  ournal)..  */.  
e6f0: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
e700: 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65 6e  e ){.    nameLen
e710: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50   = strlen(zFullP
e720: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70 50  athname);.    pP
e730: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ager = sqliteMal
e740: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61  loc( sizeof(*pPa
e750: 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33  ger) + nameLen*3
e760: 20 2b 20 33 30 20 29 3b 0a 20 20 7d 0a 0a 20 20   + 30 );.  }..  
e770: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
e780: 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72  ccured in either
e790: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
e7a0: 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d  bove, free the m
e7b0: 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e  emory .  ** poin
e7c0: 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50  ted to by zFullP
e7d0: 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68  athname, free th
e7e0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
e7f0: 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
e800: 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63  .  ** file. Sinc
e810: 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  e the pager is n
e820: 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65  ot allocated the
e830: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
e840: 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50   set .  ** any P
e850: 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72  ager.errMask var
e860: 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  iables..  */.  i
e870: 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a  f( !pPager || !z
e880: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20  FullPathname || 
e890: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e8a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
e8b0: 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71  ose(&fd);.    sq
e8c0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
e8d0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  thname);.    sql
e8e0: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b  iteFree(pPager);
e8f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
e900: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
e910: 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
e920: 20 7d 0a 0a 20 20 54 52 41 43 45 33 28 22 4f 50   }..  TRACE3("OP
e930: 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
e940: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a  EHANDLEID(fd), z
e950: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e960: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
e970: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61  me = (char*)&pPa
e980: 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
e990: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26  ->zDirectory = &
e9a0: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
e9b0: 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  e[nameLen+1];.  
e9c0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e9d0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
e9e0: 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31  ectory[nameLen+1
e9f0: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  ];.  strcpy(pPag
ea00: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
ea10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
ea20: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
ea30: 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c  zDirectory, zFul
ea40: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66  lPathname);..  f
ea50: 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e  or(i=nameLen; i>
ea60: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
ea70: 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
ea80: 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
ea90: 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
eaa0: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
eab0: 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  0;.  strcpy(pPag
eac0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46  er->zJournal, zF
ead0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
eae0: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
eaf0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
eb00: 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
eb10: 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20  urnal[nameLen], 
eb20: 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70  "-journal");.  p
eb30: 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a  Pager->fd = fd;.
eb40: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75    /* pPager->jou
eb50: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  rnalOpen = 0; */
eb60: 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
eb70: 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
eb80: 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
eb90: 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
eba0: 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20  ck = noReadlock 
ebb0: 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  && readOnly;.  /
ebc0: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
ebd0: 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
ebe0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
ebf0: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
ec00: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
ec10: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
ec20: 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a  Size = memDb-1;.
ec30: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
ec40: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
ec50: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
ec60: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
ec70: 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
ec80: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
ec90: 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
eca0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
ecb0: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
ecc0: 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30  er->nMaxPage = 0
ecd0: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
ece0: 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 61  xPage = 100;.  a
ecf0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 55 4e 4c  ssert( PAGER_UNL
ed00: 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70  OCK==0 );.  /* p
ed10: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
ed20: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
ed30: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
ed40: 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
ed50: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
ed60: 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  = tempFile;.  pP
ed70: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65  ager->memDb = me
ed80: 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
ed90: 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e  eadOnly = readOn
eda0: 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
edb0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
edc0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  /.  pPager->noSy
edd0: 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
ede0: 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75  pFile || !useJou
edf0: 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
ee00: 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67  fullSync = (pPag
ee10: 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b  er->noSync?0:1);
ee20: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
ee30: 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
ee40: 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
ee50: 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
ee60: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
ee70: 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
ee80: 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52  er->nExtra = FOR
ee90: 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78  CE_ALIGNMENT(nEx
eea0: 74 72 61 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  tra);.  pPager->
eeb0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47  sectorSize = PAG
eec0: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  ER_SECTOR_SIZE;.
eed0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
eee0: 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a  syHandler = 0; *
eef0: 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  /.  /* memset(pP
ef00: 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
ef10: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
ef20: 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70  Hash)); */.  *pp
ef30: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
ef40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
ef50: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
ef60: 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d  GEMENT.  pPager-
ef70: 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e 70  >pNext = pTsd->p
ef80: 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e 70  Pager;.  pTsd->p
ef90: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
efa0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
efb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
efc0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
efd0: 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
efe0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
eff0: 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73 79  e3pager_set_busy
f000: 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70  handler(Pager *p
f010: 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c  Pager, BusyHandl
f020: 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  er *pBusyHandler
f030: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  ){.  pPager->pBu
f040: 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73  syHandler = pBus
f050: 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a  yHandler;.}../*.
f060: 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72  ** Set the destr
f070: 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70  uctor for this p
f080: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
f090: 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74  LL, the destruct
f0a0: 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  or is called.** 
f0b0: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
f0c0: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68  ce count on each
f0d0: 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65   page reaches ze
f0e0: 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63  ro.  The destruc
f0f0: 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  tor can.** be us
f100: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69  ed to clean up i
f110: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
f120: 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20  e extra segment 
f130: 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68  appended to each
f140: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
f150: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e   destructor is n
f160: 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72  ot called as a r
f170: 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70 61 67  esult sqlite3pag
f180: 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a  er_close().  .**
f190: 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65   Destructors are
f1a0: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
f1b0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
f1c0: 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ef()..*/.void sq
f1d0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 64  lite3pager_set_d
f1e0: 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20  estructor(Pager 
f1f0: 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
f200: 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e 74  xDesc)(void*,int
f210: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44  )){.  pPager->xD
f220: 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73  estructor = xDes
f230: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
f240: 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
f250: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
f260: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
f270: 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
f280: 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77  r.** is called w
f290: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
f2a0: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63  of a page in cac
f2b0: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
f2c0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a  o its original.*
f2d0: 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73  * value as a res
f2e0: 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ult of a rollbac
f2f0: 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  k.  The callback
f300: 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65   gives higher-le
f310: 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f  vel code.** an o
f320: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65  pportunity to re
f330: 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20  store the EXTRA 
f340: 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65  section to agree
f350: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
f360: 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  ed.** page data.
f370: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
f380: 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69 74  pager_set_reinit
f390: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
f3a0: 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74  , void (*xReinit
f3b0: 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20  )(void*,int)){. 
f3c0: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
f3d0: 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a  er = xReinit;.}.
f3e0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
f3f0: 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72  age size.  Retur
f400: 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20  n the new size. 
f410: 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20   If the suggest 
f420: 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  new page.** size
f430: 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74   is inappropriat
f440: 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72  e, then an alter
f450: 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65  native page size
f460: 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20   is selected.** 
f470: 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  and returned..*/
f480: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
f490: 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28 50  r_set_pagesize(P
f4a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
f4b0: 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61  t pageSize){.  a
f4c0: 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e  ssert( pageSize>
f4d0: 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
f4e0: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
f4f0: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28 20  E_SIZE );.  if( 
f500: 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  !pPager->memDb )
f510: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61  {.    pPager->pa
f520: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
f530: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
f540: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f550: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
f560: 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
f570: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
f580: 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
f590: 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
f5a0: 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
f5b0: 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
f5c0: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
f5d0: 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
f5e0: 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
f5f0: 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
f600: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
f610: 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
f620: 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
f630: 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
f640: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
f650: 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
f660: 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
f670: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
f680: 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
f690: 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
f6a0: 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
f6b0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
f6c0: 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
f6d0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
f6e0: 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61 72 5f  cnt;.void clear_
f6f0: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
f700: 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  or(){.  sqlite3_
f710: 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20 30  io_error_hit = 0
f720: 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  ;.}.void disable
f730: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
f740: 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
f750: 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
f760: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
f770: 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
f780: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
f790: 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
f7a0: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
f7b0: 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
f7c0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
f7d0: 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
f7e0: 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
f7f0: 64 65 66 69 6e 65 20 63 6c 65 61 72 5f 73 69 6d  define clear_sim
f800: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28  ulated_io_error(
f810: 29 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  ).# define disab
f820: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
f830: 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
f840: 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
f850: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
f860: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
f870: 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
f880: 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
f890: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
f8a0: 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
f8b0: 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
f8c0: 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
f8d0: 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
f8e0: 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
f8f0: 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
f900: 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
f910: 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
f920: 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
f930: 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
f940: 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
f950: 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
f960: 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
f970: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
f980: 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
f990: 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
f9a0: 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
f9b0: 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
f9c0: 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
f9d0: 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
f9e0: 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
f9f0: 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
fa00: 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
fa10: 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
fa20: 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
fa30: 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
fa40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
fa50: 61 67 65 72 5f 72 65 61 64 5f 66 69 6c 65 68 65  ager_read_filehe
fa60: 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
fa70: 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
fa80: 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
fa90: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
faa0: 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
fab0: 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
fac0: 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b   if( MEMDB==0 ){
fad0: 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
fae0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
faf0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ();.    sqlite3O
fb00: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
fb10: 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  , 0);.    enable
fb20: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
fb30: 72 6f 72 73 28 29 3b 0a 20 20 20 20 72 63 20 3d  rors();.    rc =
fb40: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
fb50: 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
fb60: 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , N);.    if( rc
fb70: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
fb80: 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
fb90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
fba0: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
fbb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fbc0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
fbd0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
fbe0: 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ges in the disk 
fbf0: 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
fc00: 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20  with.** pPager. 
fc10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45  .**.** If the PE
fc20: 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20  NDING_BYTE lies 
fc30: 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72 65  on the page dire
fc40: 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 65  ctly after the e
fc50: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  nd of the.** fil
fc60: 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72  e, then consider
fc70: 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74 20   this page part 
fc80: 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e  of the file too.
fc90: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
fca0: 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  .** PENDING_BYTE
fcb0: 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28 74   is byte 4096 (t
fcc0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
fcd0: 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68 65   page 5) and the
fce0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
fcf0: 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79 74  file is 4096 byt
fd00: 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65  es, 5 is returne
fd10: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a  d instead of 4..
fd20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
fd30: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61  ger_pagecount(Pa
fd40: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
fd50: 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b  i64 n;.  int rc;
fd60: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
fd70: 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
fd80: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
fd90: 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65  ){.    n = pPage
fda0: 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65  r->dbSize;.  } e
fdb0: 6c 73 65 20 7b 0a 20 20 20 20 69 66 28 20 28 72  lse {.    if( (r
fdc0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
fdd0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
fde0: 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f  , &n))!=SQLITE_O
fdf0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
fe00: 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
fe10: 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
fe20: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
fe30: 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
fe40: 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
fe50: 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
fe60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f  }else{.      n /
fe70: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
fe80: 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ze;.    }.    if
fe90: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
fea0: 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
feb0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
fec0: 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d  bSize = n;.    }
fed0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50  .  }.  if( n==(P
fee0: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
fef0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
ff00: 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
ff10: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69  return n;.}...#i
ff20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ff30: 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
ff40: 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f   Clear a PgHisto
ff50: 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  ry block.*/.stat
ff60: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73  ic void clearHis
ff70: 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a  tory(PgHistory *
ff80: 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pHist){.  sqlite
ff90: 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69  Free(pHist->pOri
ffa0: 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  g);.  sqliteFree
ffb0: 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
ffc0: 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
ffd0: 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74   0;.  pHist->pSt
ffe0: 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a  mt = 0;.}.#else.
fff0: 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73  #define clearHis
10000 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a  tory(x).#endif..
10010 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
10020 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
10030 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
10040 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a  nal(Pager*);../*
10050 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66  .** Unlink pPg f
10060 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
10070 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
10080 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
10090 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
100a0 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
100b0 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
100c0 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
100d0 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
100e0 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
100f0 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
10100 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63  page() routine c
10110 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20  an leave a page 
10120 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74  in the .** pNext
10130 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c  Free/pPrevFree l
10140 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ist that is not 
10150 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  a part of any ha
10160 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  sh-chain..*/.sta
10170 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48  tic void unlinkH
10180 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a  ashChain(Pager *
10190 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
101a0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
101b0 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pgno==0 ){.    a
101c0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
101d0 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d  tHash==0 && pPg-
101e0 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
101f0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10200 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
10210 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  tHash ){.    pPg
10220 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
10230 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
10240 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  revHash;.  }.  i
10250 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
10260 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
10270 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
10280 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
10290 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70  er->nHash-1)]!=p
102a0 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
102b0 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
102c0 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
102d0 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
102e0 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e     int h = pPg->
102f0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
10300 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50  nHash-1);.    pP
10310 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
10320 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
10330 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
10340 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73   ){.    clearHis
10350 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49  tory(PGHDR_TO_HI
10360 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29  ST(pPg, pPager))
10370 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e  ;.  }.  pPg->pgn
10380 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e  o = 0;.  pPg->pN
10390 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
103a0 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a  PrevHash = 0;.}.
103b0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
103c0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
103d0 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
103e0 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
103f0 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
10400 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
10410 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
10420 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
10430 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
10440 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
10450 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
10460 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
10470 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
10480 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
10490 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
104a0 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
104b0 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
104c0 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
104d0 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
104e0 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
104f0 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
10500 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
10510 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
10520 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
10530 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
10540 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
10550 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
10560 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
10570 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
10580 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
10590 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
105a0 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
105b0 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
105c0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
105d0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
105e0 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
105f0 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
10600 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
10610 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
10620 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
10630 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
10640 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
10650 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
10660 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10670 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
10680 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
10690 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
106a0 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
106b0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
106c0 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
106d0 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
106e0 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
106f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69   table */.  unli
10700 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
10710 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66  er, pPg);.}..#if
10720 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10730 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
10740 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10750 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65  used to truncate
10760 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
10770 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a  tabase.  Delete.
10780 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f  ** all pages who
10790 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65  se pgno is large
107a0 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
107b0 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72  bSize and is unr
107c0 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65  eferenced..** Re
107d0 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c  ferenced pages l
107e0 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
107f0 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65  r->dbSize are ze
10800 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  roed..*/.static 
10810 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63  void memoryTrunc
10820 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
10830 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
10840 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67  ;.  PgHdr **ppPg
10850 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d  ;.  int dbSize =
10860 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
10870 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67  ..  ppPg = &pPag
10880 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c  er->pAll;.  whil
10890 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29  e( (pPg = *ppPg)
108a0 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
108b0 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65  Pg->pgno<=dbSize
108c0 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d   ){.      ppPg =
108d0 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
108e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
108f0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20  Pg->nRef>0 ){.  
10900 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
10910 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
10920 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
10930 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20  ze);.      ppPg 
10940 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
10950 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10960 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e     *ppPg = pPg->
10970 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
10980 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
10990 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
109a0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pPg);.      sql
109b0 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
109c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
109d0 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  e--;.    }.  }.}
109e0 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 6d  .#else.#define m
109f0 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 29  emoryTruncate(p)
10a00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
10a10 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
10a20 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20  ock on a file.  
10a30 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
10a40 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
10a50 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65  lock.** is curre
10a60 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
10a70 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69  le.  Repeat unti
10a80 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
10a90 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66  ack returns.** f
10aa0 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
10ab0 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
10ac0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
10ad0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
10ae0 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
10af0 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
10b00 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
10b10 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
10b20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
10b30 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
10b40 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
10b50 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pe){.  int rc;. 
10b60 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
10b70 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
10b80 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
10b90 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
10ba0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
10bb0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
10bc0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
10bd0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
10be0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
10bf0 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
10c00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
10c10 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
10c20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
10c30 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
10c40 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
10c50 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
10c60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
10c70 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b   && sqlite3Invok
10c80 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  eBusyHandler(pPa
10c90 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
10ca0 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  r) );.    if( rc
10cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10cc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
10cd0 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  te = locktype;. 
10ce0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10cf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
10d00 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
10d10 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
10d20 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65  f pages specifie
10d30 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
10d40 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
10d50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
10d60 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
10d70 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 70  t rc;.  sqlite3p
10d80 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
10d90 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
10da0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
10db0 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
10dc0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72  ->errCode;.    r
10dd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10de0 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69  if( nPage>=(unsi
10df0 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
10e00 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
10e10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10e20 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
10e30 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10e40 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
10e50 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
10e60 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
10e70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10e80 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  }.  rc = syncJou
10e90 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
10ea0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10eb0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
10ec0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  rc;.  }..  /* Ge
10ed0 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
10ee0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
10ef0 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63  ase before trunc
10f00 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d  ating. */.  rc =
10f10 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
10f20 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
10f30 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69  USIVE_LOCK);.  i
10f40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10f50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10f60 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70  c;.  }..  rc = p
10f70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
10f80 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
10f90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10fa0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
10fb0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
10fc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10fd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
10fe0 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
10ff0 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
11000 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
11010 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
11020 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
11030 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
11040 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
11050 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
11060 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
11070 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
11080 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
11090 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
110a0 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
110b0 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
110c0 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
110d0 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
110e0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
110f0 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
11100 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
11110 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
11120 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
11130 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
11140 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
11150 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
11160 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
11170 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
11180 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
11190 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
111a0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
111b0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
111c0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
111d0 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
111e0 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
111f0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
11200 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
11210 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
11220 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
11230 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
11240 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a  er_close(Pager *
11250 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
11260 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 23   *pPg, *pNext;.#
11270 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11280 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
11290 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c  EMENT.  /* A mal
112a0 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  loc() cannot fai
112b0 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65  l in sqlite3Thre
112c0 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20  adData() as one 
112d0 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f  or more calls to
112e0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20   .  ** malloc() 
112f0 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
11300 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74  y been made by t
11310 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72  his thread befor
11320 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74  e it gets.  ** t
11330 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68  o this point. Th
11340 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72  is means the Thr
11350 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76  eadData must hav
11360 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  e been allocated
11370 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f   already.  ** so
11380 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61   that ThreadData
11390 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73  .nAlloc can be s
113a0 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61  et..  */.  Threa
113b0 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
113c0 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
113d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
113e0 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
113f0 20 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e   pTsd && pTsd->n
11400 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a  Alloc );.#endif.
11410 0a 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65  .  switch( pPage
11420 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20  r->state ){.    
11430 63 61 73 65 20 50 41 47 45 52 5f 52 45 53 45 52  case PAGER_RESER
11440 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41  VED:.    case PA
11450 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20  GER_SYNCED: .   
11460 20 63 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c   case PAGER_EXCL
11470 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 2f  USIVE: {.      /
11480 2a 20 57 65 20 69 67 6e 6f 72 65 20 61 6e 79 20  * We ignore any 
11490 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f  IO errors that o
114a0 63 63 75 72 20 64 75 72 69 6e 67 20 74 68 65 20  ccur during the 
114b0 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a  rollback.      *
114c0 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 6f 20  * operation. So 
114d0 64 69 73 61 62 6c 65 20 49 4f 20 65 72 72 6f 72  disable IO error
114e0 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f 20 74   simulation so t
114f0 68 61 74 20 74 65 73 74 69 6e 67 0a 20 20 20 20  hat testing.    
11500 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72 65 20    ** works more 
11510 65 61 73 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  easily..      */
11520 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f 73  .      disable_s
11530 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
11540 72 73 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rs();.      sqli
11550 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
11560 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
11570 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
11580 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
11590 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20       if( !MEMDB 
115a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
115b0 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
115c0 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
115d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
115e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
115f0 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  rrCode || pPager
11600 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
11610 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
11620 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11630 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a  PAGER_SHARED: {.
11640 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42        if( !MEMDB
11650 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11660 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
11670 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
11680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11690 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
116a0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
116b0 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
116c0 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
116d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
116e0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
116f0 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
11700 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ){.#ifndef NDEBU
11710 47 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  G.    if( MEMDB 
11720 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
11730 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
11740 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
11750 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
11760 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
11770 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
11780 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
11790 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
117a0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
117b0 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
117c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65  }.#endif.    pNe
117d0 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
117e0 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
117f0 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54  ee(pPg);.  }.  T
11800 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
11810 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
11820 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
11830 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
11840 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
11850 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50  nalOpen==0 && pP
11860 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d  ager->stmtOpen==
11870 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
11880 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11890 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
118a0 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
118b0 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
118c0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
118d0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  nJournal);.  if(
118e0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
118f0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
11900 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
11910 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >stfd);.  }.  sq
11920 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
11930 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20  ager->fd);.  /* 
11940 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61  Temp files are a
11950 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
11960 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20  eted by the OS. 
11970 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   ** if( pPager->
11980 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a  tempFile ){.  **
11990 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
119a0 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
119b0 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20  name);.  ** }.  
119c0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
119d0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
119e0 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20  MANAGEMENT.  /* 
119f0 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  Remove the pager
11a00 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64   from the linked
11a10 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20   list of pagers 
11a20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20 2a  starting at .  *
11a30 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70 50 61  * ThreadData.pPa
11a40 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61  ger if memory-ma
11a50 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62  nagement is enab
11a60 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
11a70 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50  pPager==pTsd->pP
11a80 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73 64  ager ){.    pTsd
11a90 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
11aa0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  r->pNext;.  }els
11ab0 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 54  e{.    Pager *pT
11ac0 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d 70  mp;.    for(pTmp
11ad0 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b   = pTsd->pPager;
11ae0 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50   pTmp->pNext!=pP
11af0 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d  ager; pTmp=pTmp-
11b00 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70 54  >pNext){}.    pT
11b10 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67  mp->pNext = pPag
11b20 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23  er->pNext;.  }.#
11b30 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72  endif.  sqliteFr
11b40 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
11b50 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
11b60 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
11b70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11b80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11b90 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
11ba0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
11bb0 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
11bc0 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e  lite3pager_pagen
11bd0 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74  umber(void *pDat
11be0 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  a){.  PgHdr *p =
11bf0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
11c00 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
11c10 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pgno;.}../*.*
11c20 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
11c30 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
11c40 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
11c50 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
11c60 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
11c70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
11c80 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
11c90 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
11ca0 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
11cb0 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
11cc0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
11cd0 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
11ce0 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
11cf0 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
11d00 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
11d10 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
11d20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
11d30 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
11d40 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
11d50 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
11d60 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
11d70 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
11d80 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
11d90 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
11da0 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
11db0 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
11dc0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
11dd0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
11de0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
11df0 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
11e00 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
11e10 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
11e20 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50  .    if( pPg==pP
11e30 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
11e40 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20  tSynced ){.     
11e50 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
11e60 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
11e70 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
11e80 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
11e90 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
11ea0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
11eb0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
11ec0 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
11ed0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
11ee0 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
11ef0 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
11f00 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
11f10 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  xtFree;.    }els
11f20 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
11f30 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
11f40 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
11f50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
11f60 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
11f70 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
11f80 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
11f90 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
11fa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11fb0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
11fc0 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
11fd0 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  vFree;.    }.   
11fe0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
11ff0 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
12000 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
12010 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65  FO(pPg);.}.#ifde
12020 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
12030 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
12040 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
12050 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
12060 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
12070 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b   _page_ref(pPg);
12080 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12090 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
120a0 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67       REFINFO(pPg
120b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
120c0 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
120d0 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
120e0 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
120f0 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
12100 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
12110 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
12120 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
12130 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
12140 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
12150 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
12160 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
12170 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
12180 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76  lite3pager_ref(v
12190 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
121a0 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
121b0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
121c0 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
121d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
121e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
121f0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
12200 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
12210 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
12220 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
12230 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
12240 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
12250 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
12260 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
12270 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
12280 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
12290 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
122a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
122b0 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
122c0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
122d0 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
122e0 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
122f0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
12300 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
12310 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
12320 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
12330 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
12340 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
12350 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
12360 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
12370 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
12380 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
12390 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
123a0 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
123b0 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
123c0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
123d0 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
123e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
123f0 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
12400 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
12410 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
12420 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
12430 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
12440 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
12450 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
12460 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
12470 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
12480 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
12490 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
124a0 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
124b0 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
124c0 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
124d0 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
124e0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
124f0 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
12500 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
12510 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
12520 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
12530 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
12540 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
12550 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
12560 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
12570 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   so sync occurs.
12580 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12590 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
125a0 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
125b0 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
125c0 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
125d0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
125e0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
125f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12600 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
12610 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12620 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  _OK;..  /* Sync 
12630 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
12640 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
12650 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20   main database. 
12660 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68   ** (assuming th
12670 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c  ere is a journal
12680 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f   and it needs to
12690 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a   be synced.).  *
126a0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
126b0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
126c0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
126d0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61  pFile ){.      a
126e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
126f0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
12700 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
12710 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
12720 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68  ; // noSync migh
12730 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63  t be set if sync
12740 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a  hronous.      **
12750 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20   was turned off 
12760 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
12770 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
12780 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20  d.  Ticket #615 
12790 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
127a0 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  G.      {.      
127b0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
127c0 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  he pPager->nRec 
127d0 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b  counter we are k
127e0 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20  eeping agrees.  
127f0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
12800 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  e nRec computed 
12810 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
12820 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12830 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
12840 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20        i64 jSz;. 
12850 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12860 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
12870 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29  ager->jfd, &jSz)
12880 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12890 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
128a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
128b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
128c0 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20  Off==jSz );.    
128d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
128e0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72   {.        /* Wr
128f0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
12900 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
12910 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
12920 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
12930 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
12940 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
12950 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
12960 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
12970 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
12980 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
12990 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
129a0 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
129b0 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
129c0 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
129d0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
129e0 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20  ollback. .      
129f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
12a00 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
12a10 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  c ){.          T
12a20 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
12a30 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
12a40 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
12a50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
12a60 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
12a70 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
12a80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
12a90 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
12aa0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12ab0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
12ac0 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
12ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
12af0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
12b00 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
12b10 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
12b20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
12b30 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20   rc;.        rc 
12b40 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
12b50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
12b60 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
12b70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12b80 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72  n rc;..        r
12b90 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
12ba0 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
12bb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12bc0 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
12bd0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
12bf0 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
12c00 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
12c10 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
12c20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12c30 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
12c40 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  jfd, pPager->ful
12c50 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20  l_fsync);.      
12c60 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
12c70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61  rn rc;.      pPa
12c80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
12c90 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
12ca0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
12cb0 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
12cc0 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
12cd0 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
12ce0 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
12cf0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
12d00 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
12d10 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
12d20 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
12d30 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
12d40 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
12d50 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
12d60 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
12d70 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
12d80 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61  G.  /* If the Pa
12d90 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
12da0 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
12db0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
12dc0 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73  nc.  ** flag mus
12dd0 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20  t also be clear 
12de0 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20  for all pages.  
12df0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
12e00 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20  .  ** invariant 
12e10 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  is true..  */.  
12e20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50  else{.    for(pP
12e30 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
12e40 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
12e50 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61  extAll){.      a
12e60 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
12e70 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Sync==0 );.    }
12e80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12e90 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
12ea0 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  d==pPager->pFirs
12eb0 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
12ec0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12ed0 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f  ./*.** Merge two
12ee0 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20   lists of pages 
12ef0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
12f00 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20  rty and in pgno 
12f10 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  order..** Do not
12f20 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65   both fixing the
12f30 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
12f40 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
12f50 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67  PgHdr *merge_pag
12f60 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c  elist(PgHdr *pA,
12f70 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50   PgHdr *pB){.  P
12f80 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54  gHdr result, *pT
12f90 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26  ail;.  pTail = &
12fa0 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28  result;.  while(
12fb0 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20   pA && pB ){.   
12fc0 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42   if( pA->pgno<pB
12fd0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
12fe0 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
12ff0 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pA;.      pTail 
13000 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d  = pA;.      pA =
13010 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pA->pDirty;.   
13020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
13030 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
13040 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
13050 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  pB;.      pB = p
13060 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  B->pDirty;.    }
13070 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b  .  }.  if( pA ){
13080 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
13090 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65  ty = pA;.  }else
130a0 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70   if( pB ){.    p
130b0 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
130c0 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
130d0 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
130e0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
130f0 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d  result.pDirty;.}
13100 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65  ../*.** Sort the
13110 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   list of pages i
13120 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
13130 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65  r by pgno.  Page
13140 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  s are.** connect
13150 65 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69  ed by pDirty poi
13160 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65  nters.  The pPre
13170 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20  vDirty pointers 
13180 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64  are.** corrupted
13190 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a   by this sort..*
131a0 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54  /.#define N_SORT
131b0 5f 42 55 43 4b 45 54 20 32 35 0a 73 74 61 74 69  _BUCKET 25.stati
131c0 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61  c PgHdr *sort_pa
131d0 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49  gelist(PgHdr *pI
131e0 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e  n){.  PgHdr *a[N
131f0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5d 2c 20 2a  _SORT_BUCKET], *
13200 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65  p;.  int i;.  me
13210 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f  mset(a, 0, sizeo
13220 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  f(a));.  while( 
13230 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  pIn ){.    p = p
13240 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d  In;.    pIn = p-
13250 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e  >pDirty;.    p->
13260 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
13270 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52  for(i=0; i<N_SOR
13280 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29  T_BUCKET-1; i++)
13290 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d  {.      if( a[i]
132a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
132b0 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  [i] = p;.       
132c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
132d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  lse{.        p =
132e0 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
132f0 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20  a[i], p);.      
13300 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20    a[i] = 0;.    
13310 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13320 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b  ( i==N_SORT_BUCK
13330 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 61 5b  ET-1 ){.      a[
13340 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
13350 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
13360 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
13370 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
13380 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
13390 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
133a0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
133b0 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
133c0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
133d0 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
133e0 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
133f0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
13400 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
13410 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
13420 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
13430 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
13440 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
13450 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
13460 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
13470 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
13480 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
13490 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
134a0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
134b0 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
134c0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
134d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
134e0 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
134f0 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
13500 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
13510 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
13520 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
13530 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
13540 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
13550 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
13560 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
13570 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
13580 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
13590 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
135a0 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
135b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
135c0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
135d0 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
135e0 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
135f0 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
13600 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
13610 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
13620 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
13630 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
13640 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
13650 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
13660 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
13670 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
13680 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
13690 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
136a0 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
136b0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
136c0 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
136d0 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
136e0 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
136f0 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
13700 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
13710 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
13720 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
13730 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
13740 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
13750 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
13760 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
13770 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
13780 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
13790 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
137a0 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
137b0 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
137c0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
137d0 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
137e0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
137f0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
13800 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
13810 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
13820 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
13830 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
13840 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
13850 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
13860 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
13870 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
13880 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
13890 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
138a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
138b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
138c0 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73    }..  pList = s
138d0 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69  ort_pagelist(pLi
138e0 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  st);.  while( pL
138f0 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
13900 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
13910 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
13920 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
13930 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67  ->fd, (pList->pg
13940 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
13950 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
13960 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13970 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20  n rc;.    /* If 
13980 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
13990 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
139a0 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
139b0 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
139c0 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
139d0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
139e0 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61   means sqlite3pa
139f0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77  ger_truncate() w
13a00 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
13a10 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
13a20 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
13a30 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
13a40 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
13a50 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
13a60 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
13a70 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
13a80 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
13a90 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
13aa0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
13ab0 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
13ac0 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48  DEC2(pPager, PGH
13ad0 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
13ae0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
13af0 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  6);.      TRACE3
13b00 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
13b10 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13b20 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
13b30 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  gno);.      rc =
13b40 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
13b50 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
13b60 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
13b70 69 7a 65 29 3b 0a 20 20 20 20 20 20 54 45 53 54  ize);.      TEST
13b80 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
13b90 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  rite);.    }.#if
13ba0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
13bb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43  else{.      TRAC
13bc0 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E3("NOSTORE %d p
13bd0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
13be0 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73  ID(pPager), pLis
13bf0 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  t->pgno);.    }.
13c00 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
13c10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
13c20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20     pList->dirty 
13c30 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
13c40 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
13c50 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61     pList->pageHa
13c60 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
13c70 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64  ash(pList);.#end
13c80 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  if.    pList = p
13c90 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
13ca0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13cb0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
13cc0 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72  ollect every dir
13cd0 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64  ty page into a d
13ce0 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  irty list and.**
13cf0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
13d00 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
13d10 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c   that list.  All
13d20 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   pages are.** co
13d30 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  llected even if 
13d40 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
13d50 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
13d60 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65   PgHdr *pager_ge
13d70 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
13d80 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
13d90 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
13da0 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  r->pDirty;.}../*
13db0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
13dc0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
13dd0 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
13de0 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
13df0 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
13e00 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
13e10 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
13e20 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
13e30 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
13e40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13e50 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
13e60 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
13e70 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
13e80 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
13e90 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
13ea0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
13eb0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
13ec0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
13ed0 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
13ee0 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
13ef0 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
13f00 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
13f10 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
13f20 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
13f30 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
13f40 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
13f50 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
13f60 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30  rnal) ) return 0
13f70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  ;.  if( sqlite3O
13f80 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
13f90 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  ck(pPager->fd) )
13fa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
13fb0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
13fc0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
13fd0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13fe0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13ff0 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
14000 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
14010 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
14020 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
14030 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
14040 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
14050 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
14060 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
14070 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
14080 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14090 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
140a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
140b0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
140c0 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
140d0 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
140e0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
140f0 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
14100 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
14110 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
14120 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
14130 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
14140 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
14150 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
14160 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
14170 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
14180 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73  .  ** require us
14190 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
141a0 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
141b0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
141c0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
141d0 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ced;..  /* If we
141e0 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
141f0 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
14200 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
14210 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20  fsync().  ** on 
14220 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14230 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
14240 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
14250 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65  his is a.  ** ve
14260 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
14270 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
14280 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
14290 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
142a0 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
142b0 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  helped..  */.  i
142c0 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61  f( pPg==0 && pPa
142d0 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73  ger->pFirst && s
142e0 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29  yncOk && !MEMDB)
142f0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
14300 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
14310 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
14320 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
14330 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
14340 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
14350 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sync ){.      /*
14360 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
14370 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
14380 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
14390 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
143a0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
143b0 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
143c0 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
143d0 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
143e0 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72  .      ** header
143f0 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
14400 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
14410 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
14420 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  have.      ** al
14430 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
14440 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
14450 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
14460 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20  header is.      
14470 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
14480 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
14490 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
144a0 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
144b0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
144c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
144d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
144e0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
144f0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
14500 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
14510 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
14520 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14530 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14540 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
14550 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  First;.  }.  if(
14560 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pPg==0 ){.    r
14570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14580 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
14590 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
145a0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
145b0 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
145c0 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
145d0 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
145e0 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
145f0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
14600 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
14610 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
14620 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
14630 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  );.    pPg->dirt
14640 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
14650 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
14660 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
14670 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29  _pagelist( pPg )
14680 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14690 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
146a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
146b0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
146c0 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
146d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
146e0 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
146f0 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
14700 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
14710 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74   then.  ** set t
14720 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
14730 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
14740 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
14750 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f  e.  ** sqlite_do
14760 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  nt_rollback() op
14770 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
14780 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
14790 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
147a0 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
147b0 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
147c0 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
147d0 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
147e0 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ack.  ** might b
147f0 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
14800 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
14810 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
14820 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
14830 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
14840 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
14850 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
14860 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
14870 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d  s must.  ** be m
14880 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
14890 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
148a0 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20  e on out..  */. 
148b0 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
148c0 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
148d0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
148e0 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  llback = 1;.  }.
148f0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
14900 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
14910 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
14920 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
14930 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67    */.  unlinkPag
14940 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54 5f 49  e(pPg);.  TEST_I
14950 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66  NCR(pPager->nOvf
14960 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70  l);..  *ppPg = p
14970 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
14980 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14990 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
149a0 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65  s called to free
149b0 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e   superfluous dyn
149c0 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
149d0 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c  ed memory.** hel
149e0 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73  d by the pager s
149f0 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e  ystem. Memory in
14a00 20 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69   use by any SQLi
14a10 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74  te pager allocat
14a20 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72  ed.** by the cur
14a30 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20  rent thread may 
14a40 62 65 20 73 71 6c 69 74 65 46 72 65 65 28 29 65  be sqliteFree()e
14a50 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73  d..**.** nReq is
14a60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
14a70 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
14a80 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68  equired. Once th
14a90 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62  is much has.** b
14aa0 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68  een released, th
14ab0 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
14ac0 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76  ns. A negative v
14ad0 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65  alue for nReq me
14ae0 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d  ans.** free as m
14af0 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
14b00 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75  ssible. The retu
14b10 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
14b20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a  total number .**
14b30 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
14b40 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  ory released..*/
14b50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14b60 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
14b70 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69  AGEMENT.int sqli
14b80 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61 73 65  te3pager_release
14b90 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  _memory(int nReq
14ba0 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  ){.  const Threa
14bb0 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20  dData *pTsdro = 
14bc0 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
14bd0 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 50  aReadOnly();.  P
14be0 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  ager *p;.  int n
14bf0 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20  Released = 0;.  
14c00 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20  int i;..  /* If 
14c10 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  the the global m
14c20 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68  utex is held, th
14c30 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65  is subroutine be
14c40 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f  comes a.  ** o-o
14c50 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66  p; zero bytes of
14c60 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65   memory are free
14c70 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  d.  This is beca
14c80 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66  use.  ** some of
14c90 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65   the code invoke
14ca0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
14cb0 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a  on may also.  **
14cc0 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74   try to obtain t
14cd0 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74  he mutex, result
14ce0 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63  ing in a deadloc
14cf0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  k..  */.  if( sq
14d00 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30  lite3OsInMutex(0
14d10 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
14d20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74  0;.  }..  /* Out
14d30 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73  ermost loop runs
14d40 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f   for at most two
14d50 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72   iterations. Fir
14d60 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a  st iteration we.
14d70 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64    ** try to find
14d80 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e   memory that can
14d90 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74   be released wit
14da0 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79  hout calling fsy
14db0 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a  nc(). Second.  *
14dc0 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69  * iteration (whi
14dd0 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20  ch only runs if 
14de0 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64  the first failed
14df0 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79   to free nReq by
14e00 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f  tes of.  ** memo
14e10 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  ry) is permitted
14e20 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29   to call fsync()
14e30 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75  . This is of cou
14e40 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20  rse much more . 
14e50 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20   ** expensive.. 
14e60 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
14e70 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20  <=1; i++){..    
14e80 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
14e90 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70  all the SQLite p
14ea0 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20  agers opened by 
14eb0 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
14ec0 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ad. */.    for(p
14ed0 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b  =pTsdro->pPager;
14ee0 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c   p && (nReq<0 ||
14ef0 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
14f00 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
14f10 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
14f20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  .      int rc;..
14f30 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63        /* For eac
14f40 68 20 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20  h pager, try to 
14f50 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67  free as many pag
14f60 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28  es as possible (
14f70 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a  without .      *
14f80 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28  * calling fsync(
14f90 29 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  ) if this is the
14fa0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
14fb0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
14fc0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  t .      ** loop
14fd0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
14fe0 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
14ff0 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f  OK==(rc = pager_
15000 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20 26 70  recycle(p, i, &p
15010 50 67 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20  Pg)) && pPg) {. 
15020 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20         /* We've 
15030 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
15040 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
15050 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
15060 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a   been .        *
15070 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
15080 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
15090 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
150a0 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
150b0 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73         ** (pFirs
150c0 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20  tSynced). It is 
150d0 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c  still in the all
150e0 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69   pages (pAll) li
150f0 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  st. .        ** 
15100 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  Remove it from t
15110 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20  his list before 
15120 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20  freeing..       
15130 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
15140 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
15150 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
15160 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
15170 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
15180 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
15190 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
151a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
151b0 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
151c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
151d0 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f  );.        page_
151e0 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
151f0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
15200 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e      if( pPg==p->
15210 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
15220 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67     p->pAll = pPg
15230 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
15240 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15250 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70       for( pTmp=p
15260 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e  ->pAll; pTmp->pN
15270 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d  extAll!=pPg; pTm
15280 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p=pTmp->pNextAll
15290 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70   ){}.          p
152a0 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  Tmp->pNextAll = 
152b0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
152c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
152d0 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71   nReleased += sq
152e0 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50  liteAllocSize(pP
152f0 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
15300 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
15310 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
15320 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15330 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
15340 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
15350 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
15360 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15370 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   or .        ** 
15380 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72  journal in pager
15390 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20  _recycle(). The 
153a0 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74  error is not ret
153b0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20  urned to the .  
153c0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
153d0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
153e0 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
153f0 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
15400 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
15410 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20     ** The error 
15420 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
15430 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72   to the user (or
15440 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63   users, in the c
15450 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase .        ** 
15460 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65  of a shared page
15470 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20  r cache) of the 
15480 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20  pager for which 
15490 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65  the error occure
154a0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
154b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 72        assert( (r
154c0 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
154d0 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c  IOERR || rc==SQL
154e0 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20  ITE_FULL );.    
154f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
15500 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
15510 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  RVED );.        
15520 70 61 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72  pager_error(p, r
15530 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
15540 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
15550 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
15560 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
15570 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
15580 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  GEMENT */../*.**
15590 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
155a0 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
155b0 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
155c0 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
155d0 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
155e0 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
155f0 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
15600 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
15610 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
15620 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
15630 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b  *.** A _get work
15640 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e  s for any page n
15650 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
15660 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61  an 0.  If the da
15670 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
15680 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
15690 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
156a0 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61  e, then no actua
156b0 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f  l disk.** read o
156c0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65  ccurs and the me
156d0 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
156e0 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  e page is initia
156f0 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20  lized to.** all 
15700 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72  zeros.  The extr
15710 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
15720 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
15730 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a  ays initialized.
15740 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ** to zeros the 
15750 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
15760 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
15770 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
15780 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
15790 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
157a0 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
157b0 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
157c0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
157d0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
157e0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
157f0 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
15800 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
15810 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c  o sqlite3pager_l
15820 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
15830 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
15840 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70  _lookup() attemp
15850 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
15860 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
15870 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
15880 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
15890 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
158a0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
158b0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
158c0 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
158d0 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f   in whereas _loo
158e0 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
158f0 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
15900 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
15910 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
15920 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
15930 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
15940 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
15950 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
15960 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
15970 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
15980 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  e _lookup() neve
15990 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
159a0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
159b0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
159c0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
159d0 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
159e0 74 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67  te3pager_get(Pag
159f0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
15a00 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70   pgno, void **pp
15a10 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
15a20 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
15a30 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
15a40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
15a50 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
15a60 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
15a70 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
15a80 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
15a90 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
15aa0 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
15ab0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
15ac0 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
15ad0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
15ae0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
15af0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
15b00 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
15b10 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
15b20 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
15b30 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
15b40 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
15b50 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
15b60 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
15b70 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  *ppPage = 0;.  i
15b80 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
15b90 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
15ba0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
15bb0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
15bc0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
15bd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
15be0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
15bf0 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
15c00 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
15c10 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
15c20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15c30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
15c40 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
15c50 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66  !MEMDB ){.    if
15c60 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
15c70 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  dlock ){.      r
15c80 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
15c90 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
15ca0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
15cb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15cc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15cd0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
15ce0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
15cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
15d00 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
15d10 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
15d20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
15d30 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
15d40 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
15d50 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
15d60 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
15d70 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
15d80 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
15d90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73    */.    if( has
15da0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
15db0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 20  r) ){.       /* 
15dc0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
15dd0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15de0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
15df0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
15e00 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74         ** import
15e10 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
15e20 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
15e30 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
15e40 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
15e50 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
15e60 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
15e70 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
15e80 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
15e90 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
15ea0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
15eb0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
15ec0 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
15ed0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
15ee0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
15ef0 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
15f00 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
15f10 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
15f20 69 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61  it .       ** ba
15f30 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20  ck..       ** . 
15f40 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
15f50 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
15f60 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
15f70 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
15f80 2c 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  , the.       ** 
15f90 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
15fa0 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
15fb0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
15fc0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
15fd0 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69       ** obtain i
15fe0 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  t's own EXCLUSIV
15ff0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
16000 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
16010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
16020 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
16030 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
16040 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16050 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16070 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
16080 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
16090 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  O_LOCK);.       
160a0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
160b0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
160c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
160d0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
160e0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
160f0 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
16100 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
16110 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20  XCLUSIVE;..     
16120 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
16130 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
16140 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
16150 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
16160 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20        ** we are 
16170 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  unable to open t
16180 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
16190 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   .       **.    
161a0 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61     ** The journa
161b0 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
161c0 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
161d0 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20  d itself.  The. 
161e0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
161f0 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
16200 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
16210 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
16220 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a  e holds.       *
16230 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
16240 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
16250 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
16260 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
16270 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
16280 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
16290 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
162a0 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  time..       */.
162b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
162c0 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
162d0 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
162e0 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
162f0 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
16300 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16310 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
16320 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
16330 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
16340 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
16350 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
16360 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65  OCK;.         re
16370 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
16380 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
16390 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
163a0 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
163b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
163c0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
163d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
163e0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
163f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
16400 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
16410 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
16420 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20  lHdr = 0;..     
16430 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
16440 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
16450 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
16460 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
16470 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
16480 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
16490 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
164a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
164b0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
164c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
164d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
164e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65  K ){.         re
164f0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
16500 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
16510 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16520 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
16530 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
16540 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63   for page in cac
16550 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  he */.    pPg = 
16560 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
16570 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
16580 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61  if( MEMDB && pPa
16590 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
165a0 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
165b0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
165c0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
165d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
165e0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
165f0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
16600 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
16610 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
16620 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
16630 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
16640 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66  ->nMiss);.    if
16650 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
16660 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
16670 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
16680 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a  ==0 || MEMDB ){.
16690 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
166a0 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20  a new page */.  
166b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
166c0 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e  nPage>=pPager->n
166d0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Hash ){.        
166e0 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73  pager_resize_has
166f0 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a  h_table(pPager,.
16700 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
16710 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32  r->nHash<256 ? 2
16720 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61  56 : pPager->nHa
16730 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 69  sh*2);.        i
16740 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  f( pPager->nHash
16750 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16760 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16770 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
16780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
16790 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
167a0 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67  Raw( sizeof(*pPg
167b0 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) + pPager->page
167c0 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
167d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167e0 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
167f0 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
16800 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
16810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16820 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
16830 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
16840 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
16850 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16860 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
16870 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
16880 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f  et(pPg, 0, sizeo
16890 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20  f(*pPg));.      
168a0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
168b0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
168c0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
168d0 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
168e0 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
168f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
16900 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
16910 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  r;.      pPg->pN
16920 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
16930 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61  >pAll;.      pPa
16940 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
16950 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
16960 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
16970 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
16980 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
16990 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
169a0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78  rt( pPager->nMax
169b0 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e  Page==(pPager->n
169c0 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20  Page-1) );.     
169d0 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50     pPager->nMaxP
169e0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  age++;.      }. 
169f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16a00 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
16a10 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  le(pPager, 1, &p
16a20 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
16a30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16a40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16a50 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
16a60 20 61 73 73 65 72 74 28 70 50 67 29 20 3b 0a 20   assert(pPg) ;. 
16a70 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67     }.    pPg->pg
16a80 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69  no = pgno;.    i
16a90 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
16aa0 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
16ab0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
16ac0 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
16ad0 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
16ae0 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
16af0 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
16b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
16b10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16b20 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
16b30 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
16b40 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
16b50 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
16b60 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
16b70 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
16b80 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
16b90 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
16ba0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
16bb0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
16bc0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
16bd0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
16be0 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
16bf0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
16c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
16c10 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d   (pPager->aInStm
16c20 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
16c30 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
16c40 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
16c50 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
16c60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16c70 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
16c80 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70  from_stmt_list(p
16c90 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  Pg);.    }.    m
16ca0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
16cb0 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
16cc0 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
16cd0 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  g);..    pPager-
16ce0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28  >nRef++;.    if(
16cf0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
16d00 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
16d10 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
16d20 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
16d30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
16d40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16d50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
16d60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16d70 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
16d80 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
16d90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61  ;.      rc = pPa
16da0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
16db0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16dc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70     }..    /* Pop
16dd0 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77  ulate the page w
16de0 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72  ith data, either
16df0 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   by reading from
16e00 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
16e10 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79    ** file, or by
16e20 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74   setting the ent
16e30 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f  ire page to zero
16e40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16e50 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
16e60 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3c  gecount(pPager)<
16e70 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
16e80 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  DB ){.      mems
16e90 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
16ea0 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
16eb0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
16ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
16ed0 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
16ee0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
16ef0 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
16f00 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
16f10 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
16f20 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
16f30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16f40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16f50 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
16f60 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
16f70 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20  TO_DATA(pPg),.  
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
16fa0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
16fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
16fc0 43 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61  CE3("FETCH %d pa
16fd0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
16fe0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
16ff0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44  pgno);.      COD
17000 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48 44  EC1(pPager, PGHD
17010 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
17020 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
17030 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17040 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
17050 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
17060 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
17070 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a   pPg->pgno = 0;.
17080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
17090 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52  ager_unref(PGHDR
170a0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a  _TO_DATA(pPg));.
170b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
170c0 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  c;.      }else{.
170d0 20 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43          TEST_INC
170e0 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
170f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17100 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  .    /* Link the
17110 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
17120 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a  age hash table *
17130 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26  /.    h = pgno &
17140 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
17150 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
17160 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70  pgno!=0 );.    p
17170 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
17180 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
17190 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
171a0 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
171b0 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
171c0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
171d0 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
171e0 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
171f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
17200 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
17210 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
17220 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
17230 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
17240 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
17250 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
17260 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
17270 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
17280 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
17290 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20   is in the page 
172a0 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45  cache. */.    TE
172b0 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
172c0 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f  nHit);.    page_
172d0 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
172e0 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f  *ppPage = PGHDR_
172f0 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
17300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
17320 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
17330 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
17340 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
17350 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
17360 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
17370 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
17380 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
17390 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
173a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
173b0 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
173c0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
173d0 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54  3pager_get().  T
173e0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
173f0 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
17400 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
17410 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20  3pager_get() is 
17420 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
17430 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
17440 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
17450 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
17460 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
17470 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
17480 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
17490 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
174a0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
174b0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
174c0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
174d0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
174e0 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
174f0 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75  lite3pager_looku
17500 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
17510 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
17520 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
17530 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
17540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
17550 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  o!=0 );.  if( pP
17560 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
17570 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17580 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
17590 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
175a0 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
175b0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
175c0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
175d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
175e0 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
175f0 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
17600 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
17610 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
17620 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
17630 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
17640 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
17650 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
17660 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
17670 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
17680 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
17690 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
176a0 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
176b0 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
176c0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
176d0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
176e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
176f0 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
17700 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
17710 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70  er_unref(void *p
17720 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
17730 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65  pPg;..  /* Decre
17740 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
17750 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  ce count for thi
17760 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50  s page.  */.  pP
17770 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
17780 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  R(pData);.  asse
17790 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
177a0 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
177b0 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
177c0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
177d0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
177e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
177f0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
17800 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
17810 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
17820 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
17830 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
17840 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
17850 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
17860 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
17870 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
17880 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
17890 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
178a0 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
178b0 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
178c0 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
178d0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
178e0 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
178f0 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
17900 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
17910 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
17920 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
17930 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
17940 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
17950 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
17960 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70  needSync==0 && p
17970 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
17980 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ced==0 ){.      
17990 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
179a0 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20  nced = pPg;.    
179b0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
179c0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
179d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
179e0 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
179f0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17a00 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
17a10 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
17a20 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
17a30 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
17a40 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
17a50 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
17a60 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
17a70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
17a80 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
17a90 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
17aa0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
17ab0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
17ac0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
17ad0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
17ae0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
17af0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17b00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
17b10 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
17b20 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
17b30 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
17b40 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
17b50 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
17b60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17b70 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
17b80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17b90 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
17ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
17bb0 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
17bc0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
17bd0 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
17be0 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
17bf0 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
17c00 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
17c10 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
17c20 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
17c30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
17c40 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
17c50 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
17c60 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
17c70 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
17c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17c90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17ca0 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
17cb0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
17cc0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
17cd0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
17ce0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
17cf0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
17d00 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  unt(pPager);.  p
17d10 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
17d20 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
17d30 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
17d40 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
17d50 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
17d60 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  al==0 ){.    rc 
17d70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
17d80 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
17d90 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
17da0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
17db0 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
17dc0 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ve(pPager->zJour
17dd0 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
17de0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e00 20 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70      pPager->temp
17e10 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  File);.  pPager-
17e20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
17e30 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
17e40 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
17e50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
17e60 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
17e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
17e80 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
17e90 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
17ea0 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
17eb0 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  llSync(pPager->j
17ec0 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
17ed0 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  _fsync);.  sqlit
17ee0 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
17ef0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
17f00 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
17f10 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  .  sqlite3OsOpen
17f20 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72  Directory(pPager
17f30 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  ->jfd, pPager->z
17f40 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50  Directory);.  pP
17f50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17f60 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
17f70 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
17f80 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
17f90 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
17fa0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
17fb0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
17fc0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
17fd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
17fe0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
17ff0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18000 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
18010 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
18020 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
18030 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
18040 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
18050 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
18060 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
18070 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
18080 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
18090 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
180a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
180b0 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28  ager_stmt_begin(
180c0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
180d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
180e0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
180f0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
18100 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
18110 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
18120 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18130 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18140 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
18150 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18160 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
18170 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
18180 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
18190 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
181a0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
181b0 6e 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  nal = 0;.  if( r
181c0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
181d0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
181e0 73 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29  s was a malloc()
181f0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 6e 20 77   failure, then w
18200 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c  e will not be cl
18210 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65 72 0a  osing the pager.
18220 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20      ** file. So 
18230 64 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e  delete any journ
18240 61 6c 20 66 69 6c 65 20 77 65 20 6d 61 79 20 68  al file we may h
18250 61 76 65 20 6a 75 73 74 20 63 72 65 61 74 65 64  ave just created
18260 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
18270 20 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 20 77   ** the system w
18280 69 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73 65 64  ill get confused
18290 2c 20 77 65 20 68 61 76 65 20 61 20 72 65 61 64  , we have a read
182a0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c  -lock on the fil
182b0 65 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d  e and a.    ** m
182c0 79 73 74 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61  ysterious journa
182d0 6c 20 68 61 73 20 61 70 70 65 61 72 65 64 20 69  l has appeared i
182e0 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
182f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
18300 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
18310 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
18320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
18330 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
18340 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
18350 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
18360 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
18370 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  OCK;.  }.  retur
18380 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
18390 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
183a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
183b0 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
183c0 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
183d0 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
183e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
183f0 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
18400 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
18410 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  t() is called..*
18420 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
18430 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69  ger_rollback() i
18440 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
18450 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63    sqlite3pager_c
18460 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
18470 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
18480 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69  3pager_unref() i
18490 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
184a0 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
184b0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
184c0 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
184d0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
184e0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
184f0 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f   any open page o
18500 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
18510 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67  e file.  Nothing
18520 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74   changes about t
18530 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20  he page - it is 
18540 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a  used merely to.*
18550 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e  * acquire a poin
18560 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
18570 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
18580 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65  s proof that the
18590 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  re is.** already
185a0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
185b0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
185c0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70  .** The second p
185d0 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
185e0 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  es how much spac
185f0 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  e in bytes to re
18600 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d  serve for a.** m
18610 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18620 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73  le-name at the s
18630 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
18640 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63  nal when it is c
18650 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  reated..**.** A 
18660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
18670 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
18680 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
18690 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d  y file.  For tem
186a0 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c  porary.** files,
186b0 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
186c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
186d0 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
186e0 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  il there is an.*
186f0 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  * actual need to
18700 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
18710 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
18720 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
18730 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64  already reserved
18740 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68   for writing, th
18750 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18760 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
18770 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
18780 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74  go ahead and get
18790 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
187a0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ck on the file.*
187b0 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e  * immediately in
187c0 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67  stead of waiting
187d0 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f   until we try to
187e0 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
187f0 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67  .  The.** exFlag
18800 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61   is ignored if a
18810 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
18820 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
18830 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
18840 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a  ger_begin(void *
18850 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46 6c 61  pData, int exFla
18860 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
18870 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
18880 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
18890 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
188a0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
188b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
188c0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
188d0 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
188e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
188f0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
18900 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
18910 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
18920 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
18930 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
18940 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
18950 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
18960 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
18970 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
18980 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
18990 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
189a0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
189b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
189c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
189d0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
189e0 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
189f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18a00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18a10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
18a20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
18a30 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
18a40 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
18a50 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
18a60 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
18a70 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
18a80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18a90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
18aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18ab0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
18ad0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
18ae0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  e = 0;.      TRA
18af0 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE2("TRANSACTION
18b00 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18b10 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
18b20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  if( pPager->useJ
18b30 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65  ournal && !pPage
18b40 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
18b50 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
18b60 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
18b70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
18b80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18b90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18ba0 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74  Make a page dirt
18bb0 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74  y.  Set its dirt
18bc0 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69  y flag and add i
18bd0 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a  t to the dirty.*
18be0 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  * page list..*/.
18bf0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
18c00 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67  Dirty(PgHdr *pPg
18c10 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
18c20 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  rty==0 ){.    Pa
18c30 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
18c40 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
18c50 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
18c60 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
18c70 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
18c80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18c90 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
18ca0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d   pPager->pDirty-
18cb0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
18cc0 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  g;.    }.    pPg
18cd0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30  ->pPrevDirty = 0
18ce0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  ;.    pPager->pD
18cf0 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  irty = pPg;.  }.
18d00 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
18d10 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65  page clean.  Cle
18d20 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74  ar its dirty bit
18d30 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66   and remove it f
18d40 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  rom the.** dirty
18d50 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
18d60 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
18d70 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29  lean(PgHdr *pPg)
18d80 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
18d90 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64  ty ){.    pPg->d
18da0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
18db0 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b  ( pPg->pDirty ){
18dc0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72  .      pPg->pDir
18dd0 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
18de0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
18df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18e00 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
18e10 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
18e20 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79  revDirty->pDirty
18e30 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
18e40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18e50 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44   pPg->pPager->pD
18e60 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
18e70 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ty;.    }.  }.}.
18e80 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
18e90 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
18ea0 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
18eb0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
18ec0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
18ed0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
18ee0 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
18ef0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
18f00 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
18f10 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
18f20 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
18f30 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
18f40 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
18f50 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
18f60 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
18f70 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
18f80 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
18f90 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
18fa0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
18fb0 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
18fc0 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
18fd0 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
18fe0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
18ff0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
19000 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
19010 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
19020 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
19030 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
19040 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
19050 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
19060 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
19070 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
19080 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
19090 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
190a0 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
190b0 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
190c0 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
190d0 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
190e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
190f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
19100 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
19110 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
19120 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
19130 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
19140 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
19150 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
19160 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
19170 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  o sqlite3pager_c
19180 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
19190 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
191a0 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
191b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
191c0 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a  ger_write(void *
191d0 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
191e0 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
191f0 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
19200 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
19210 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
19220 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19230 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
19240 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
19250 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
19260 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
19270 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
19280 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
19290 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
192a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
192b0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
192c0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
192d0 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
192e0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
192f0 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
19300 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
19310 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
19320 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
19330 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
19340 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
19350 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
19360 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
19370 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
19380 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
19390 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69  urnal && (pPg->i
193a0 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d  nStmt || pPager-
193b0 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
193c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
193d0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
193e0 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
193f0 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
19400 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
19410 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
19420 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
19430 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
19440 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
19450 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
19460 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
19470 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
19480 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
19490 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
194a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
194b0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
194c0 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
194d0 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
194e0 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
194f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
19500 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
19510 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
19520 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
19530 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 20  n(pData, 0);.   
19540 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
19560 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
19570 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19580 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
19590 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
195a0 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
195b0 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
195c0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
195d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
195e0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
195f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
19600 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19610 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19620 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
19630 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
19640 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73  n || !pPager->us
19650 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
19660 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
19670 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  he = 1;.  .    /
19680 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
19690 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
196a0 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
196b0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
196c0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
196d0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
196e0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
196f0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
19700 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
19710 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
19720 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
19730 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
19740 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
19750 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e      if( !pPg->in
19760 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
19770 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
19780 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20  | MEMDB) ){.    
19790 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
197a0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
197b0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
197c0 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a        int szPg;.
197d0 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44          if( MEMD
197e0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  B ){.          P
197f0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
19800 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
19810 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
19820 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
19830 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
19840 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
19850 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
19860 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  o);.          as
19870 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72  sert( pHist->pOr
19880 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ig==0 );.       
19890 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20     pHist->pOrig 
198a0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
198b0 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  w( pPager->pageS
198c0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
198d0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
198e0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
198f0 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
19900 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Orig, PGHDR_TO_D
19910 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
19920 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
19930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19950 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76    u32 cksum, sav
19960 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ed;.          ch
19970 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e  ar *pData2, *pEn
19980 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;.          /* 
19990 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
199a0 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
199b0 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
199c0 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
199d0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
199e0 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
199f0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
19a00 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
19a10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
19a20 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
19a30 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
19a40 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
19a50 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
19a60 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  er) );.         
19a70 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32   pData2 = CODEC2
19a80 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
19a90 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
19aa0 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
19ab0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
19ac0 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
19ad0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e  );.          pEn
19ae0 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61  d = pData2 + pPa
19af0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
19b00 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20           pData2 
19b10 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  -= 4;.          
19b20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70  saved = *(u32*)p
19b30 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70  End;.          p
19b40 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63  ut32bits(pEnd, c
19b50 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
19b60 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e   szPg = pPager->
19b70 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20  pageSize+8;.    
19b80 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
19b90 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e  pData2, pPg->pgn
19ba0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
19bb0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
19bc0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
19bd0 44 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20  Data2, szPg);.  
19be0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19bf0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a  journalOff += sz
19c00 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  Pg;.          TR
19c10 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE4("JOURNAL %d
19c20 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
19c30 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
19c40 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
19c50 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
19c60 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
19c70 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
19c80 20 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73   *(u32*)pEnd = s
19c90 61 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20  aved;...  /* An 
19ca0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
19cb0 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
19cc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
19cd0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  he .          **
19ce0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
19cf0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
19d00 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
19d10 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ove..          *
19d20 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
19d30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
19d50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
19d60 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
19d70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
19d80 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19d90 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
19da0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
19db0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
19dc0 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
19dd0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
19de0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
19df0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
19e00 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
19e10 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nc;.          if
19e20 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
19e30 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Use ){.         
19e40 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
19e50 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
19e60 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
19e70 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &7);.           
19e80 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
19e90 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
19ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19eb0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
19ec0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
19ed0 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
19ee0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
19ef0 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
19f00 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  nc;.        TRAC
19f10 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E4("APPEND %d pa
19f20 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
19f30 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
19f40 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
19f50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
19f60 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29  , pPg->needSync)
19f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19f80 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
19f90 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  c ){.        pPa
19fa0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
19fb0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
19fc0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
19fd0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 1;.    }.  .  
19fe0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
19ff0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
1a000 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
1a010 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
1a020 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
1a030 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
1a040 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
1a050 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
1a060 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
1a070 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1a080 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
1a090 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
1a0a0 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
1a0b0 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
1a0c0 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
1a0d0 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
1a0e0 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
1a0f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
1a100 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
1a110 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
1a120 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
1a130 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1a140 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1a150 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1a160 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
1a170 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
1a180 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  bSize );.      i
1a190 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1a1a0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1a1b0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1a1c0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1a1d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1a1e0 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d  t( pHist->pStmt=
1a1f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  =0 );.        pH
1a200 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c  ist->pStmt = sql
1a210 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
1a220 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
1a230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
1a240 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
1a250 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1a260 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48  Hist->pStmt, PGH
1a270 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1a280 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1a290 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1a2a0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54        TRACE3("ST
1a2b0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
1a2c0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1a2d0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1a2e0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pgno);.      }el
1a2f0 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
1a300 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43   *pData2 = CODEC
1a310 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
1a320 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34   pPg->pgno, 7)-4
1a330 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
1a340 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d  its(pData2, pPg-
1a350 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1a360 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1a370 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64  ite(pPager->stfd
1a380 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
1a390 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20  ->pageSize+4);. 
1a3a0 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53         TRACE3("S
1a3b0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
1a3c0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1a3d0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1a3e0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1a3f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a400 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1a410 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1a420 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
1a430 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
1a440 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a450 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
1a460 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
1a470 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1a480 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1a490 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1a4a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
1a4b0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
1a4c0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
1a4d0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
1a4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1a4f0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
1a500 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1a510 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50  ->dbSize<(int)pP
1a520 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
1a530 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1a540 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  pPg->pgno;.    i
1a550 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
1a560 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
1a570 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
1a580 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
1a590 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1a5a0 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
1a5b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a5c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1a5d0 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
1a5e0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1a5f0 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
1a600 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
1a610 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1a620 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
1a630 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
1a640 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
1a650 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
1a660 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
1a670 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
1a680 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
1a690 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
1a6a0 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
1a6b0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
1a6c0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1a6d0 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
1a6e0 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65  pPg->dirty;.}.#e
1a6f0 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1a700 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
1a710 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
1a720 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
1a730 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
1a740 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1a750 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
1a760 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
1a770 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  t sqlite3pager_o
1a780 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a  verwrite(Pager *
1a790 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1a7a0 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  o, void *pData){
1a7b0 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a  .  void *pPage;.
1a7c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
1a7d0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1a7e0 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
1a7f0 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
1a800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a810 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a820 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1a830 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
1a840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a850 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
1a860 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
1a870 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1a880 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
1a890 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
1a8a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a8b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1a8c0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1a8d0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1a8e0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
1a8f0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1a900 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
1a910 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
1a920 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63   page "pgno" bac
1a930 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
1a940 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
1a950 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
1a960 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
1a970 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
1a980 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
1a990 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
1a9a0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
1a9b0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
1a9c0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1a9d0 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
1a9e0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
1a9f0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
1aa00 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
1aa10 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
1aa20 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
1aa30 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
1aa40 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
1aa50 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
1aa60 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
1aa70 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
1aa80 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
1aa90 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
1aaa0 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
1aab0 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
1aac0 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
1aad0 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
1aae0 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
1aaf0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1ab00 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1ab10 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
1ab20 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
1ab30 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
1ab40 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
1ab50 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
1ab60 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
1ab70 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
1ab80 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
1ab90 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
1aba0 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1abb0 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
1abc0 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
1abd0 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
1abe0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1abf0 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
1ac00 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
1ac10 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
1ac20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1ac30 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
1ac40 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
1ac50 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
1ac60 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
1ac70 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
1ac80 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
1ac90 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
1aca0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1acb0 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
1acc0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1acd0 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
1ace0 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
1acf0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
1ad00 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
1ad10 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f  ause the page co
1ad20 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63  ntains.** critic
1ad30 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
1ad40 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
1ad50 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64  e it gets rolled
1ad60 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a   back in spite.*
1ad70 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f  * of the dont_ro
1ad80 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
1ad90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1ada0 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50  ger_dont_write(P
1adb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1adc0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
1add0 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d  r *pPg;..  if( M
1ade0 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a  EMDB ) return;..
1adf0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
1ae00 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1ae10 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
1ae20 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 6e  g!=0 );  /* We n
1ae30 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f  ever call _dont_
1ae40 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68 65  write unless the
1ae50 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d 20   page is in mem 
1ae60 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  */.  pPg->always
1ae70 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
1ae80 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26  if( pPg->dirty &
1ae90 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  & !pPager->stmtI
1aea0 6e 55 73 65 20 29 7b 0a 20 20 20 20 69 66 28 20  nUse ){.    if( 
1aeb0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1aec0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
1aed0 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
1aee0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
1aef0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1af00 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
1af10 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1af20 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
1af30 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
1af40 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
1af50 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
1af60 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1af70 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
1af80 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
1af90 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
1afa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
1afb0 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
1afc0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1afd0 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
1afe0 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
1aff0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
1b000 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
1b010 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
1b020 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
1b030 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
1b040 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
1b050 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
1b060 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
1b070 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
1b080 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
1b090 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
1b0a0 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
1b0b0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1b0c0 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
1b0d0 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
1b0e0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1b0f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b100 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57    TRACE3("DONT_W
1b110 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
1b120 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47  %d\n", pgno, PAG
1b130 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1b140 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
1b150 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
1b160 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1b170 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
1b180 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1b190 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
1b1a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1b1b0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1b1c0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1b1d0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1b1e0 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
1b1f0 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
1b200 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
1b210 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1b220 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1b230 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
1b240 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1b250 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
1b260 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
1b270 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
1b280 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
1b290 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nal..*/.void sql
1b2a0 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
1b2b0 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44  ollback(void *pD
1b2c0 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
1b2d0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1b2e0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
1b2f0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1b300 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28  ->pPager;..  if(
1b310 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1b320 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1b330 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1b340 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75  alOpen==0 ) retu
1b350 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61  rn;.  if( pPg->a
1b360 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1b370 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1b380 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42  ollback || MEMDB
1b390 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1b3a0 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
1b3b0 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1b3c0 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1b3d0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1b3e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b3f0 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
1b400 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1b410 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
1b420 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1b430 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50  >pgno&7);.    pP
1b440 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1b450 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1b460 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1b470 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1b480 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
1b490 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1b4a0 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67  no&7);.      pag
1b4b0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
1b4c0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
1b4d0 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
1b4e0 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64  ROLLBACK page %d
1b4f0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
1b500 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
1b510 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66  ager));.  }.  if
1b520 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1b530 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53  Use && !pPg->inS
1b540 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  tmt && (int)pPg-
1b550 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
1b560 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  tmtSize ){.    a
1b570 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1b580 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
1b590 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1b5a0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
1b5b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b5c0 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
1b5d0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1b5e0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1b5f0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1b600 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61  o&7);.    page_a
1b610 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1b620 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  pPg);.  }.}.../*
1b630 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
1b640 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1b650 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
1b660 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1b670 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
1b680 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
1b690 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
1b6a0 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
1b6b0 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
1b6c0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1b6d0 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
1b6e0 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
1b6f0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
1b700 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
1b710 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
1b720 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
1b730 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1b740 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1b750 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1b760 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
1b770 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1b780 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
1b790 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
1b7a0 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
1b7b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b7c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41  ERROR;.  }.  TRA
1b7d0 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
1b7e0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1b7f0 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
1b800 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61   ){.    pPg = pa
1b810 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1b820 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
1b830 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
1b840 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69  ){.      clearHi
1b850 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
1b860 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1b870 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
1b880 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
1b890 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1b8a0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
1b8b0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1b8c0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1b8d0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
1b8e0 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
1b8f0 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
1b900 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
1b910 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
1b920 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1b930 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  = 0;.#ifndef NDE
1b940 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  BUG.    for(pPg=
1b950 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
1b960 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
1b970 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
1b980 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1b990 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1b9a0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1b9b0 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
1b9c0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
1b9d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b9e0 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
1b9f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1ba00 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
1ba10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1ba20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
1ba30 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1ba40 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
1ba50 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
1ba60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ba70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69    if( pPager->di
1ba80 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20  rtyCache==0 ){. 
1ba90 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79     /* Exit early
1baa0 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20   (without doing 
1bab0 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69  the time-consumi
1bac0 6e 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63  ng sqlite3OsSync
1bad0 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a  () calls).    **
1bae0 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62   if there have b
1baf0 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
1bb00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1bb10 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
1bb20 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
1bb30 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Sync==0 );.    r
1bb40 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
1bb50 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
1bb60 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1bb70 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75  e = -1;.    retu
1bb80 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1bb90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1bba0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
1bbb0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1bbc0 73 79 6e 63 28 70 50 61 67 65 72 2c 20 30 2c 20  sync(pPager, 0, 
1bbd0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1bbe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1bbf0 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
1bc00 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
1bc10 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1bc20 65 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  e = -1;.  }.  re
1bc30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bc40 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
1bc50 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
1bc60 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
1bc70 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1bc80 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
1bc90 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
1bca0 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
1bcb0 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
1bcc0 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
1bcd0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
1bce0 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
1bcf0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
1bd00 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
1bd10 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
1bd20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
1bd30 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
1bd40 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
1bd50 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   (SQLITE_PROTOCO
1bd60 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  L) or unless som
1bd70 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
1bd80 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
1bd90 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
1bda0 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
1bdb0 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
1bdc0 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
1bdd0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
1bde0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
1bdf0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
1be00 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
1be10 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
1be20 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
1be30 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
1be40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1be50 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
1be60 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
1be70 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1be80 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1be90 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43   TRACE2("ROLLBAC
1bea0 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
1beb0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1bec0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67   MEMDB ){.    Pg
1bed0 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
1bee0 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
1bef0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
1bf00 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
1bf10 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
1bf20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77   assert( !p->alw
1bf30 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
1bf40 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72       if( !p->dir
1bf50 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
1bf60 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
1bf70 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
1bf80 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
1bf90 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  pOrig );.       
1bfa0 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
1bfb0 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
1bfc0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
1bfd0 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  )->pStmt );.    
1bfe0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1bff0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69      }..      pHi
1c000 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1c010 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
1c020 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
1c030 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
1c040 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
1c050 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
1c060 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
1c070 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1c080 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42     TRACE3("ROLLB
1c090 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25  ACK-PAGE %d of %
1c0a0 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50  d\n", p->pgno, P
1c0b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1c0c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c0d0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 50 41        TRACE3("PA
1c0e0 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f  GE %d is clean o
1c0f0 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  n %d\n", p->pgno
1c100 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c110 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1c120 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70    clearHistory(p
1c130 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Hist);.      p->
1c140 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
1c150 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20   p->inJournal = 
1c160 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74  0;.      p->inSt
1c170 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  mt = 0;.      p-
1c180 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e  >pPrevStmt = p->
1c190 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
1c1a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1c1b0 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
1c1c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
1c1d0 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f  einiter(PGHDR_TO
1c1e0 5f 44 41 54 41 28 70 29 2c 20 70 50 61 67 65 72  _DATA(p), pPager
1c1f0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1c200 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1c210 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1c220 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1c230 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
1c240 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1c250 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1c260 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
1c270 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
1c280 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
1c290 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
1c2a0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1c2b0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
1c2c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c2d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
1c2e0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1c2f0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
1c300 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
1c310 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
1c320 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1c330 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c340 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ze = -1;.    ret
1c350 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
1c360 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1c370 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
1c380 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
1c390 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
1c3a0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1c3b0 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
1c3c0 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
1c3d0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1c3e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
1c3f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1c400 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1c410 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
1c420 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
1c430 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
1c440 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
1c450 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
1c460 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77   rc2 = pager_unw
1c470 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
1c480 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1c490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c4a0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
1c4b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1c4c0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1c4d0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
1c4e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1c4f0 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  = -1;..  /* If a
1c500 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
1c510 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
1c520 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
1c530 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
1c540 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53  er.  ** cache. S
1c550 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72  o call pager_err
1c560 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20  or() on the way 
1c570 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20  out to make any 
1c580 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73  error .  ** pers
1c590 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72  istent..  */.  r
1c5a0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1c5b0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
1c5c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1c5d0 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
1c5e0 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
1c5f0 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
1c600 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
1c610 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1c620 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
1c630 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  itable..*/.int s
1c640 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72 65  qlite3pager_isre
1c650 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
1c660 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1c670 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
1c680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c690 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1c6a0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1c6b0 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  e pager..*/.int 
1c6c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
1c6d0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
1c6e0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1c6f0 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a  Pager->nRef;.}..
1c700 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1c710 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
1c720 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
1c730 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
1c740 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
1c750 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65  int *sqlite3page
1c760 72 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70  r_stats(Pager *p
1c770 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
1c780 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
1c790 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
1c7a0 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
1c7b0 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
1c7c0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
1c7d0 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
1c7e0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
1c7f0 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
1c800 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
1c810 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1c820 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
1c830 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
1c840 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
1c850 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[8] = pPager->n
1c860 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70  Ovfl;.  a[9] = p
1c870 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
1c880 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
1c890 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
1c8a0 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
1c8b0 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
1c8c0 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
1c8d0 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
1c8e0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1c8f0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
1c900 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1c910 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
1c920 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
1c930 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1c940 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
1c950 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1c960 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
1c970 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
1c980 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
1c990 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
1c9a0 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
1c9b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1c9c0 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70  t_begin(Pager *p
1c9d0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1c9e0 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
1c9f0 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
1ca00 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  IZE];.  assert( 
1ca10 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
1ca20 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  se );.  assert( 
1ca30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
1ca40 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53  0 );.  TRACE2("S
1ca50 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c  TMT-BEGIN %d\n",
1ca60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1ca70 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1ca80 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
1ca90 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20  mtInUse = 1;.   
1caa0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
1cab0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1cac0 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ze;.    return S
1cad0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1cae0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
1caf0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
1cb00 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1cb10 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65  open = 1;.    re
1cb20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cb30 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1cb40 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1cb50 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  n );.  pPager->a
1cb60 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  InStmt = sqliteM
1cb70 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
1cb80 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
1cb90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
1cba0 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Stmt==0 ){.    /
1cbb0 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  * sqlite3OsLock(
1cbc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
1cbd0 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20  ED_LOCK); */.   
1cbe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1cbf0 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  OMEM;.  }.#ifnde
1cc00 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20  f NDEBUG.  rc = 
1cc10 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1cc20 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1cc30 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
1cc40 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
1cc50 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
1cc60 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28  ailed;.  assert(
1cc70 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
1cc80 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ze == pPager->jo
1cc90 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64  urnalOff );.#end
1cca0 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  if.  pPager->stm
1ccb0 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
1ccc0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
1ccd0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1cce0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1ccf0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
1cd00 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  HdrOff = 0;.  pP
1cd10 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20  ager->stmtCksum 
1cd20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
1cd30 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  nit;.  if( !pPag
1cd40 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
1cd50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cd60 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
1cd70 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73  Temp, &pPager->s
1cd80 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tfd);.    if( rc
1cd90 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
1cda0 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70  in_failed;.    p
1cdb0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
1cdc0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
1cdd0 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
1cde0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
1cdf0 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
1ce00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ce10 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
1ce20 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
1ce30 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->aInStmt ){.  
1ce40 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
1ce50 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20  ger->aInStmt);. 
1ce60 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1ce70 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
1ce80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ce90 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
1cea0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
1ceb0 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
1cec0 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
1ced0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
1cee0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1cef0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c  .    PgHdr *pPg,
1cf00 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41   *pNext;.    TRA
1cf10 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54  CE2("STMT-COMMIT
1cf20 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1cf30 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
1cf40 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
1cf50 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
1cf60 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
1cf70 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
1cf80 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
1cf90 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
1cfa0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  /.      sqliteFr
1cfb0 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ee( pPager->aInS
1cfc0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61  tmt );.      pPa
1cfd0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
1cfe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1cff0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
1d000 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  t; pPg; pPg=pNex
1d010 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
1d020 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
1d030 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d040 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20  pPg->inStmt );. 
1d050 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
1d060 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1d070 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
1d080 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
1d090 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
1d0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
1d0b0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1d0c0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1d0d0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1d0e0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
1d0f0 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
1d100 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1d110 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1d120 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1d130 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
1d140 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
1d150 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
1d160 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
1d170 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
1d180 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
1d190 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d1a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
1d1b0 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
1d1c0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1d1d0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c  e3pager_stmt_rol
1d1e0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
1d1f0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1d200 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1d210 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54  mtInUse ){.    T
1d220 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
1d230 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
1d240 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1d250 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1d260 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
1d270 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
1d280 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
1d290 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
1d2a0 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
1d2b0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1d2c0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1d2d0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1d2e0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1d2f0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1d300 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
1d310 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1d320 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
1d330 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1d340 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1d350 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
1d360 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
1d370 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
1d380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d390 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1d3a0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1d3b0 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
1d3c0 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1d3d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1d3e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d3f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d400 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
1d410 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1d420 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1d430 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
1d440 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
1d450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1d460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d470 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
1d480 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
1d490 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d4a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
1d4b0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
1d4c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1d4d0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1d4e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c  sqlite3pager_fil
1d4f0 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
1d500 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1d510 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1d520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d530 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
1d540 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d550 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
1d560 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
1d570 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20  r_dirname(Pager 
1d580 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1d590 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
1d5a0 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
1d5b0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
1d5c0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
1d5d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
1d5e0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1d5f0 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61  ite3pager_journa
1d600 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
1d610 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1d620 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
1d630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d640 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
1d650 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
1d660 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
1d670 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
1d680 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
1d690 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
1d6a0 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
1d6b0 71 6c 69 74 65 33 70 61 67 65 72 5f 6e 6f 73 79  qlite3pager_nosy
1d6c0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
1d6d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1d6e0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f  er->noSync;.}../
1d6f0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
1d700 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
1d710 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
1d720 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63  3pager_set_codec
1d730 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1d740 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  r,.  void *(*xCo
1d750 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
1d760 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
1d770 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
1d780 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
1d790 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
1d7a0 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
1d7b0 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a  = pCodecArg;.}..
1d7c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1d7d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1d7e0 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1d7f0 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1d800 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1d810 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1d820 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1d830 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1d840 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1d850 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1d860 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69   *pPager){.  voi
1d870 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64  d *pPage;.  PgHd
1d880 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
1d890 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1d8a0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1d8b0 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
1d8c0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
1d8d0 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
1d8e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1d8f0 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61  (pPager, 1, &pPa
1d900 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1d910 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1d920 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
1d930 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1d940 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1d950 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1d960 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52  turn rc;..  /* R
1d970 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ead the current 
1d980 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34  value at byte 24
1d990 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20  . */.  pPgHdr = 
1d9a0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50  DATA_TO_PGHDR(pP
1d9b0 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63  age);.  change_c
1d9c0 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76  ounter = retriev
1d9d0 65 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20  e32bits(pPgHdr, 
1d9e0 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  24);..  /* Incre
1d9f0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1da00 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1da10 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1da20 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e  te 24. */.  chan
1da30 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
1da40 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1da50 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
1da60 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61  pPgHdr))+24, cha
1da70 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
1da80 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1da90 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1daa0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  */.  sqlite3page
1dab0 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1dac0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dad0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
1dae0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1daf0 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1db00 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1db10 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1db20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1db30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1db40 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1db50 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1db60 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1db70 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1db80 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1db90 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1dba0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1dbb0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1dbc0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1dbd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1dbe0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1dbf0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1dc00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1dc10 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1dc20 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1dc30 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1dc40 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1dc50 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1dc60 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1dc70 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1dc80 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1dc90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1dca0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1dcb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1dcc0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1dcd0 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1dce0 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1dcf0 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1dd00 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1dd10 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1dd20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1dd30 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1dd40 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1dd50 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  nc() call..**.**
1dd60 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1dd70 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1dd80 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1dd90 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1dda0 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1ddb0 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1ddc0 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1ddd0 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1dde0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1ddf0 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  er_sync(Pager *p
1de00 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
1de10 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f  r *zMaster, Pgno
1de20 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20   nTrunc){.  int 
1de30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1de40 0a 20 20 54 52 41 43 45 34 28 22 44 41 54 41 42  .  TRACE4("DATAB
1de50 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
1de60 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
1de70 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
1de80 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
1de90 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
1dea0 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  runc);..  /* If 
1deb0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1dec0 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
1ded0 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
1dee0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
1def0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1df00 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1df10 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
1df20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
1df30 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1df40 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
1df50 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
1df60 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1df70 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1df80 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
1df90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1dfa0 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  en );..    /* If
1dfb0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1dfc0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
1dfd0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1dfe0 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
1dff0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
1e000 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
1e010 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
1e020 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
1e030 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
1e040 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
1e050 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
1e060 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
1e070 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
1e080 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1e090 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
1e0a0 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
1e0b0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
1e0c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1e0d0 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
1e0e0 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
1e0f0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
1e100 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1e110 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1e120 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
1e130 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1e140 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
1e150 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e160 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1e170 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
1e180 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e190 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1e1a0 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1e1b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
1e1c0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1e1d0 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
1e1e0 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
1e1f0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
1e200 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
1e210 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
1e220 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
1e230 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1e240 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1e250 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1e260 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1e270 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76  gno i;.        v
1e280 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
1e290 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20      int iSkip = 
1e2a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1e2b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ager);.        f
1e2c0 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
1e2d0 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
1e2e0 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
1e2f0 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50          if( !(pP
1e300 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1e310 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37  [i/8] & (1<<(i&7
1e320 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20  ))) && i!=iSkip 
1e330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1e340 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1e350 5f 67 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  _get(pPager, i, 
1e360 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
1e370 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e380 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1e390 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1e3a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e3b0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1e3c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1e3d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1e3e0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1e3f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1e400 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1e410 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1e420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e430 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  } .      }.#endi
1e440 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  f.      rc = wri
1e450 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1e460 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1e470 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e480 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1e490 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1e4a0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
1e4b0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1e4c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e4d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1e4e0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  exit;.    }..#if
1e4f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e500 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1e510 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1e520 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e530 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
1e540 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1e550 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1e560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1e570 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1e580 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1e590 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
1e5a0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
1e5b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1e5c0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1e5d0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1e5e0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1e5f0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1e600 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
1e610 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e620 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1e630 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
1e640 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1e650 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1e660 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1e670 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
1e680 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1e690 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
1e6a0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
1e6b0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1e6c0 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65  _SYNCED;.  }else
1e6d0 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54   if( MEMDB && nT
1e6e0 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  runc!=0 ){.    r
1e6f0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1e700 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1e710 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a  , nTrunc);.  }..
1e720 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74  sync_exit:.  ret
1e730 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1e740 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1e750 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
1e760 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 69 64  Move the page id
1e770 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 61 74  entified by pDat
1e780 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  a to location pg
1e790 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  no in the file. 
1e7a0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
1e7b0 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
1e7c0 65 73 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  es to the curren
1e7d0 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20  t page pgno. If 
1e7e0 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20  current page.** 
1e7f0 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
1e800 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  ady in the rollb
1e810 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ack journal, it 
1e820 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74  is not written t
1e830 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68  here by.** by th
1e840 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20  is routine. The 
1e850 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  same applies to 
1e860 74 68 65 20 70 61 67 65 20 70 44 61 74 61 20 72  the page pData r
1e870 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72  efers to on entr
1e880 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  y to.** this rou
1e890 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
1e8a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
1e8b0 67 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ge refered to by
1e8c0 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61   pData remain va
1e8d0 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
1e8e0 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
1e8f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1e900 61 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20  age pData (i.e. 
1e910 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
1e920 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
1e930 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
1e940 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
1e950 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
1e960 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
1e970 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
1e980 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1e990 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
1e9a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1e9b0 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
1e9c0 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
1e9d0 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
1e9e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
1e9f0 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
1ea00 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
1ea10 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
1ea20 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
1ea30 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
1ea40 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
1ea50 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
1ea60 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
1ea70 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ive)..*/.int sql
1ea80 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61  ite3pager_movepa
1ea90 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1eaa0 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 50  , void *pData, P
1eab0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
1eac0 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
1ead0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
1eae0 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
1eaf0 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e   .  int h;.  Pgn
1eb00 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
1eb10 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1eb20 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
1eb30 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64   TRACE5("MOVE %d
1eb40 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
1eb50 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
1eb60 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
1eb70 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1eb80 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
1eb90 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a  eedSync, pgno);.
1eba0 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64  .  if( pPg->need
1ebb0 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64  Sync ){.    need
1ebc0 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
1ebd0 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
1ebe0 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1ebf0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ec00 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  pPg->dirty );.  
1ec10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ec20 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
1ec30 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70  }..  /* Unlink p
1ec40 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
1ec50 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c  h-chain */.  unl
1ec60 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
1ec70 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a  ger, pPg);..  /*
1ec80 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
1ec90 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
1eca0 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
1ecb0 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
1ecc0 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61   ** from it's ha
1ecd0 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20  sh chain. Also, 
1ece0 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  if the PgHdr.nee
1ecf0 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f  dSync was set fo
1ed00 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e  r .  ** page pgn
1ed10 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f  o before the 'mo
1ed20 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  ve' operation, i
1ed30 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  t needs to be re
1ed40 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72  tained .  ** for
1ed50 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20   the page moved 
1ed60 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50  there..  */.  pP
1ed70 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  gOld = pager_loo
1ed80 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
1ed90 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
1eda0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1edb0 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  PgOld->nRef==0 )
1edc0 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68  ;.    unlinkHash
1edd0 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
1ede0 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43  gOld);.    makeC
1edf0 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20  lean(pPgOld);.  
1ee00 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65    if( pPgOld->ne
1ee10 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
1ee20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
1ee30 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  inJournal );.   
1ee40 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1ee50 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67  l = 1;.      pPg
1ee60 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1ee70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1ee80 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
1ee90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1eea0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
1eeb0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67  e number for pPg
1eec0 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
1eed0 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68  nto the new hash
1eee0 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73  -chain. */.  ass
1eef0 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
1ef00 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
1ef10 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26  no;.  h = pgno &
1ef20 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
1ef30 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  1);.  if( pPager
1ef40 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20  ->aHash[h] ){.  
1ef50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ef60 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
1ef70 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
1ef80 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
1ef90 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
1efa0 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  g;.  }.  pPg->pN
1efb0 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
1efc0 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50  ->aHash[h];.  pP
1efd0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
1efe0 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72   pPg;.  pPg->pPr
1eff0 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d  evHash = 0;..  m
1f000 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
1f010 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1f020 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  che = 1;..  if( 
1f030 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
1f040 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
1f050 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
1f060 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
1f070 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
1f080 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
1f090 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
1f0a0 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
1f0b0 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
1f0c0 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
1f0d0 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
1f0e0 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
1f0f0 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
1f100 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
1f110 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61  d the .    ** Pa
1f120 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.aInJournal b
1f130 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  it has been set.
1f140 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   This needs to b
1f150 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f  e remedied by lo
1f160 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ading.    ** the
1f170 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
1f180 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73  ager-cache and s
1f190 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
1f1a0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a  .needSync flag..
1f1b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1f1c0 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  e sqlite3pager_g
1f1d0 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61  et() call may ca
1f1e0 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  use the journal 
1f1f0 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65  to sync. So make
1f200 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65  .    ** sure the
1f210 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1f220 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e  flag is set too.
1f230 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
1f240 72 63 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e  rc;.    void *pN
1f250 65 65 64 53 79 6e 63 3b 0a 20 20 20 20 61 73 73  eedSync;.    ass
1f260 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1f270 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20  dSync );.    rc 
1f280 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1f290 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
1f2a0 79 6e 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53  yncPgno, &pNeedS
1f2b0 79 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ync);.    if( rc
1f2c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1f2d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
1f2e0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
1f2f0 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50  1;.    DATA_TO_P
1f300 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d  GHDR(pNeedSync)-
1f310 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1f320 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52     DATA_TO_PGHDR
1f330 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a  (pNeedSync)->inJ
1f340 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
1f350 6d 61 6b 65 44 69 72 74 79 28 44 41 54 41 5f 54  makeDirty(DATA_T
1f360 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e  O_PGHDR(pNeedSyn
1f370 63 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c));.    sqlite3
1f380 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4e 65 65  pager_unref(pNee
1f390 64 53 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72  dSync);.  }..  r
1f3a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f3b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
1f3c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1f3d0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1f3e0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
1f3f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
1f400 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
1f410 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72  he file lock for
1f420 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
1f430 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
1f440 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20  value is one of 
1f450 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f  NO_LOCK, SHARED_
1f460 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c  LOCK, RESERVED_L
1f470 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  OCK,.** PENDING_
1f480 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49  LOCK, or EXCLUSI
1f490 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20  VE_LOCK..*/.int 
1f4a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63  sqlite3pager_loc
1f4b0 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50  kstate(Pager *pP
1f4c0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1f4d0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61  sqlite3OsLockSta
1f4e0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  te(pPager->fd);.
1f4f0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1f500 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1f510 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
1f520 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
1f530 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
1f540 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
1f550 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f560 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61  pager_refdump(Pa
1f570 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1f580 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
1f590 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
1f5a0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
1f5b0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
1f5c0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
1f5d0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1f5e0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1f5f0 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
1f600 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
1f610 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
1f620 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
1f630 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
1f640 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
1f650 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  if..#endif /* SQ
1f660 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
1f670 20 2a 2f 0a                                       */.