/ Hex Artifact Content
Login

Artifact ca7112635ac51779c44f93e562e811df939fb402:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 32 36  : pager.c,v 1.26
0350: 36 20 32 30 30 36 2f 30 34 2f 30 37 20 31 33 3a  6 2006/04/07 13:
0360: 35 34 3a 34 37 20 64 72 68 20 45 78 70 20 24 0a  54:47 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28  .#define TRACE1(
0440: 58 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  X)       sqlite3
0450: 44 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23  DebugPrintf(X).#
0460: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0470: 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  Y)     sqlite3De
0480: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23  bugPrintf(X,Y).#
0490: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
04a0: 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65  Y,Z)   sqlite3De
04b0: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29  bugPrintf(X,Y,Z)
04c0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
04d0: 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33  X,Y,Z,W) sqlite3
04e0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04f0: 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Z,W).#define TRA
0500: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0530: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
0540: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
0550: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0560: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c  define TRACE4(X,
0580: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0590: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
05a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
05b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
05c0: 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 64   macros are used
05d0: 20 77 69 74 68 69 6e 20 74 68 65 20 54 52 41 43   within the TRAC
05e0: 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76  EX() macros abov
05f0: 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75  e.** to print ou
0600: 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  t file-descripto
0610: 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52  rs. .**.** PAGER
0620: 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69  ID() takes a poi
0630: 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
0640: 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20 61  struct as it's a
0650: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0660: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0670: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0680: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
0690: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
06a0: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
06b0: 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e   as it's argumen
06c0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  t..*/.#define PA
06d0: 47 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28  GERID(p) ((int)(
06e0: 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20  p->fd)).#define 
06f0: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
0700: 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a   ((int)fd)../*.*
0710: 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65  * The page cache
0720: 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61   as a whole is a
0730: 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20  lways in one of 
0740: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
0750: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
0760: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
0770: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0780: 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  che is not curre
0790: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
07a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
07b0: 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e            writin
07c0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
07d0: 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ile.  There is n
07e0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
07f0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
0800: 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  held in memory. 
0810: 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   This is the ini
0820: 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  tial.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
0840: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ate..**.**   PAG
0850: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20  ER_SHARED       
0860: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0870: 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  is reading the d
0880: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74    Writing is not
08b0: 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65   permitted.  The
08c0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20  re can be.**    
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64     multiple read
08f0: 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68  ers accessing th
0900: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a  e same database.
0910: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0920: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74           file at
0930: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
0940: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45  **.**   PAGER_RE
0950: 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73  SERVED      This
0960: 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73   process has res
0970: 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61  erved the databa
0980: 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  se for writing.*
0990: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
09a0: 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20          but has 
09b0: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79  not yet made any
09c0: 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20   changes.  Only 
09d0: 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20  one process.**  
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63       at a time c
0a00: 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64  an reserve the d
0a10: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72  atabase.  The or
0a20: 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  iginal.**       
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
0a50: 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  s not been modif
0a60: 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20  ied so other.** 
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20        processes 
0a90: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
0aa0: 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b  ding the on-disk
0ab0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0ac0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0ad0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  se file..**.**  
0ae0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
0af0: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0b00: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0b10: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0b40: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0b50: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0b60: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0b70: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
0b80: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
0b90: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
0ba0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bc0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0bd0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  ng..**.**   PAGE
0be0: 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20  R_SYNCED        
0bf0: 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  The pager moves 
0c00: 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72  to this state fr
0c10: 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  om PAGER_EXCLUSI
0c20: 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  VE.**           
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65              afte
0c40: 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
0c50: 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
0c60: 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ten to the.**   
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0c90: 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
0ca0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
0cb0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
0cc0: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e             disk.
0cd0: 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e   All that remain
0ce0: 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65  s to do is to re
0cf0: 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  move the.**     
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61    journal file a
0d20: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
0d30: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20  on will be.**   
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a      committed..*
0d60: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61  *.** The page ca
0d70: 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20  che comes up in 
0d80: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d90: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a  he first time a.
0da0: 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
0db0: 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  get() occurs, th
0dc0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0dd0: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0de0: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0df0: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0e00: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0e10: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0e20: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0e30: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0e40: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0e50: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0e60: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0e70: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
0e80: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0e90: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0ea0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0eb0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0ec0: 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65  that sqlite_page
0ed0: 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  _write() can onl
0ee0: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0ef0: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0f00: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0f10: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0f20: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0f30: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0f40: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0f50: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0f60: 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61  VED.).** The tra
0f70: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0f80: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0f90: 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e  s when before an
0fa0: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
0fb0: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
0fc0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74  abase file.  Aft
0fd0: 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67  er an sqlite3pag
0fe0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  er_rollback().**
0ff0: 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72   or sqlite_pager
1000: 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73  _commit(), the s
1010: 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74  tate goes back t
1020: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
1030: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1040: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1050: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1060: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1070: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1080: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1090: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
10a0: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
10b0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
10c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
10d0: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
10e0: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10f0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
1100: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
1110: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49        5../*.** I
1120: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  f the SQLITE_BUS
1130: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  Y_RESERVED_LOCK 
1140: 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20  macro is set to 
1150: 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d  true at compile-
1160: 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61  time,.** then fa
1170: 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f  iled attempts to
1180: 20 67 65 74 20 61 20 72 65 73 65 72 76 65 64 20   get a reserved 
1190: 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65  lock will invoke
11a0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
11b0: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f  ck..** This is o
11c0: 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ff by default.  
11d0: 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73  To see why, cons
11e0: 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
11f0: 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20  ng scenario:.** 
1200: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65  .** Suppose thre
1210: 61 64 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  ad A already has
1220: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
1230: 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73 65 72  nd wants a reser
1240: 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72  ved lock..** Thr
1250: 65 61 64 20 42 20 61 6c 72 65 61 64 79 20 68 61  ead B already ha
1260: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
1270: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65  k and wants an e
1280: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
1290: 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61  If.** both threa
12a0: 64 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65  ds are using the
12b0: 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ir busy callback
12c0: 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  s, it might be a
12d0: 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65   long time.** be
12e0: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
12f0: 74 68 72 65 61 64 73 20 67 69 76 65 20 75 70 20  threads give up 
1300: 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f  and allows the o
1310: 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e  ther to proceed.
1320: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
1330: 68 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20  hread trying to 
1340: 67 65 74 20 74 68 65 20 72 65 73 65 72 76 65 64  get the reserved
1350: 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71   lock gives up q
1360: 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74  uickly.** (if it
1370: 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69   never invokes i
1380: 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ts busy callback
1390: 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  ) then the conte
13a0: 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a  ntion will be.**
13b0: 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c   resolved quickl
13c0: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
13d0: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
13e0: 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65  ED_LOCK.# define
13f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1400: 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e  ERVED_LOCK 0.#en
1410: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1420: 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c  macro rounds val
1430: 75 65 73 20 75 70 20 73 6f 20 74 68 61 74 20 69  ues up so that i
1440: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1450: 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20  n address it.** 
1460: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1470: 20 62 65 20 61 6e 20 61 64 64 72 65 73 73 20 74   be an address t
1480: 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74  hat is aligned t
1490: 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  o an 8-byte boun
14a0: 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  dary..*/.#define
14b0: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
14c0: 28 58 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e  (X)   (((X)+7)&~
14d0: 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69  7)../*.** Each i
14e0: 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  n-memory image o
14f0: 66 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20  f a page begins 
1500: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
1510: 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68  ng header..** Th
1520: 69 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c  is header is onl
1530: 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69  y visible to thi
1540: 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20  s pager module. 
1550: 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63   The client.** c
1560: 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70  ode that calls p
1570: 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74  ager sees only t
1580: 68 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  he data that fol
1590: 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e  lows the header.
15a0: 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f  .**.** Client co
15b0: 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73  de should call s
15c0: 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
15d0: 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72  e() on a page pr
15e0: 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a  ior to making.**
15f0: 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f   any modificatio
1600: 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e  ns to that page.
1610: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
1620: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1630: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1640: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1650: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
1660: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1670: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
1680: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
1690: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
16a0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
16b0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
16c0: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
16d0: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
16e0: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
16f0: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1700: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1710: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1720: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1730: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1740: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1750: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1760: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
1770: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
1780: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
1790: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
17a0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
17b0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
17c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
17d0: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
17e0: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
17f0: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69  3pager_write() i
1800: 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  s called and.** 
1810: 69 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e  is cleared again
1820: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63   when the page c
1830: 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65  ontent is writte
1840: 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72  n back to the or
1850: 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  iginal.** databa
1860: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65  se file..*/.type
1870: 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72  def struct PgHdr
1880: 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50   PgHdr;.struct P
1890: 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a  gHdr {.  Pager *
18a0: 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
18b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
18c0: 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68  ager to which th
18d0: 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20  is page belongs 
18e0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
1910: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
1920: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
1930: 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72  *pNextHash, *pPr
1940: 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68  evHash;  /* Hash
1950: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
1960: 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20   for PgHdr.pgno 
1970: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1980: 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65  tFree, *pPrevFre
1990: 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20  e;  /* Freelist 
19a0: 6f 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  of pages where n
19b0: 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64  Ref==0 */.  PgHd
19c0: 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20  r *pNextAll;    
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19e0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
19f0: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
1a00: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
1a10: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
1a20: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
1a30: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1a40: 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61  */.  u8 inJourna
1a50: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1a60: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68      /* TRUE if h
1a70: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
1a80: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
1a90: 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20  u8 inStmt;      
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ab0: 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65  * TRUE if in the
1ac0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
1ad0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
1ae0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
1af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1b00: 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  E if we need to 
1b10: 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67  write back chang
1b20: 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  es */.  u8 needS
1b30: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
1b40: 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a         /* Sync j
1b50: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72  ournal before wr
1b60: 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  iting this page 
1b70: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
1b80: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
1b90: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64      /* Disable d
1ba0: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
1bb0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
1bc0: 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66    short int nRef
1bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
1bf0: 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  ers of this page
1c00: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
1c10: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
1c20: 20 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61       /* Dirty pa
1c30: 67 65 73 20 73 6f 72 74 65 64 20 62 79 20 50 67  ges sorted by Pg
1c40: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66 64  Hdr.pgno */.#ifd
1c50: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1c60: 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65  PAGES.  u32 page
1c70: 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f  Hash;.#endif.  /
1c80: 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
1c90: 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65  ze bytes of page
1ca0: 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69   data follow thi
1cb0: 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a  s header */.  /*
1cc0: 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79   Pager.nExtra by
1cd0: 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74  tes of local dat
1ce0: 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67  a follow the pag
1cf0: 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e data */.};../*
1d00: 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65  .** For an in-me
1d10: 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61  mory only databa
1d20: 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69  se, some extra i
1d30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  nformation is re
1d40: 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20  corded about.** 
1d50: 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61  each page so tha
1d60: 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65  t changes can be
1d70: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28   rolled back.  (
1d80: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  Journal files ar
1d90: 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f  e not.** used fo
1da0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
1db0: 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c  bases.)  The fol
1dc0: 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  lowing informati
1dd0: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a  on is added to.*
1de0: 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  * the end of eve
1df0: 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66  ry EXTRA block f
1e00: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1e10: 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  abases..**.** Th
1e20: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63  is information c
1e30: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61  ould have been a
1e40: 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f  dded directly to
1e50: 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63   the PgHdr struc
1e60: 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65  ture..** But the
1e70: 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20  n it would take 
1e80: 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79  up an extra 8 by
1e90: 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f  tes of storage o
1ea0: 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a  n every PgHdr.**
1eb0: 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62   even for disk-b
1ec0: 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20  ased databases. 
1ed0: 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75   Splitting it ou
1ee0: 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e  t saves 8 bytes.
1ef0: 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c    This.** is onl
1f00: 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30  y a savings of 0
1f10: 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65  .8% but those pe
1f20: 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70  rcentages add up
1f30: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1f40: 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67  uct PgHistory Pg
1f50: 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20  History;.struct 
1f60: 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38  PgHistory {.  u8
1f70: 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20   *pOrig;     /* 
1f80: 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65  Original page te
1f90: 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20  xt.  Restore to 
1fa0: 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72  this on a full r
1fb0: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20  ollback */.  u8 
1fc0: 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54  *pStmt;     /* T
1fd0: 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74  ext as it was at
1fe0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1ff0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
2000: 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f  atement */.};../
2010: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
2020: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
2030: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
2040: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
2050: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
2060: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
2070: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  EC1(P,D,N,X) if(
2080: 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b   P->xCodec!=0 ){
2090: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
20a0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
20b0: 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  }.# define CODEC
20c0: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
20d0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30  r*)(P->xCodec!=0
20e0: 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43  ?P->xCodec(P->pC
20f0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44  odecArg,D,N,X):D
2100: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
2110: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
2120: 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20  ) /* NO-OP */.# 
2130: 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c  define CODEC2(P,
2140: 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44  D,N,X) ((char*)D
2150: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2160: 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65  Convert a pointe
2170: 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74  r to a PgHdr int
2180: 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  o a pointer to i
2190: 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62  ts data.** and b
21a0: 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64  ack again..*/.#d
21b0: 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44  efine PGHDR_TO_D
21c0: 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29  ATA(P)  ((void*)
21d0: 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69  (&(P)[1])).#defi
21e0: 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52  ne DATA_TO_PGHDR
21f0: 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29  (D)  (&((PgHdr*)
2200: 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e  (D))[-1]).#defin
2210: 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  e PGHDR_TO_EXTRA
2220: 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28  (G,P) ((void*)&(
2230: 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29  (char*)(&(G)[1])
2240: 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d  )[(P)->pageSize]
2250: 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f  ).#define PGHDR_
2260: 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20  TO_HIST(P,PGR)  
2270: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  \.            ((
2280: 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68  PgHistory*)&((ch
2290: 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28  ar*)(&(P)[1]))[(
22a0: 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28  PGR)->pageSize+(
22b0: 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a  PGR)->nExtra])..
22c0: 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f  /*.** How big to
22d0: 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
22e0: 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  able used for lo
22f0: 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79  cating in-memory
2300: 20 70 61 67 65 73 0a 2a 2a 20 62 79 20 70 61 67   pages.** by pag
2310: 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 6d  e number. This m
2320: 61 63 72 6f 20 6c 6f 6f 6b 73 20 61 20 6c 69 74  acro looks a lit
2330: 74 6c 65 20 73 69 6c 6c 79 2c 20 62 75 74 20 69  tle silly, but i
2340: 73 20 65 76 61 6c 75 61 74 65 64 0a 2a 2a 20 61  s evaluated.** a
2350: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 20  t compile-time, 
2360: 6e 6f 74 20 72 75 6e 2d 74 69 6d 65 20 28 61 74  not run-time (at
2370: 20 6c 65 61 73 74 20 66 6f 72 20 67 63 63 20 74   least for gcc t
2380: 68 69 73 20 69 73 20 74 72 75 65 29 2e 0a 2a 2f  his is true)..*/
2390: 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41  .#define N_PG_HA
23a0: 53 48 20 28 5c 0a 20 20 28 4d 41 58 5f 50 41 47  SH (\.  (MAX_PAG
23b0: 45 53 3e 31 30 32 34 29 3f 32 30 34 38 3a 20 5c  ES>1024)?2048: \
23c0: 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 35 31  .  (MAX_PAGES>51
23d0: 32 29 3f 31 30 32 34 3a 20 5c 0a 20 20 28 4d 41  2)?1024: \.  (MA
23e0: 58 5f 50 41 47 45 53 3e 32 35 36 29 3f 35 31 32  X_PAGES>256)?512
23f0: 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53  : \.  (MAX_PAGES
2400: 3e 31 32 38 29 3f 32 35 36 3a 20 5c 0a 20 20 28  >128)?256: \.  (
2410: 4d 41 58 5f 50 41 47 45 53 3e 36 34 29 3f 31 32  MAX_PAGES>64)?12
2420: 38 3a 36 34 20 5c 0a 29 0a 0a 2f 2a 0a 2a 2a 20  8:64 \.)../*.** 
2430: 48 61 73 68 20 61 20 70 61 67 65 20 6e 75 6d 62  Hash a page numb
2440: 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61  er.*/.#define pa
2450: 67 65 72 5f 68 61 73 68 28 50 4e 29 20 20 28 28  ger_hash(PN)  ((
2460: 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53 48 2d 31  PN)&(N_PG_HASH-1
2470: 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e  ))../*.** A open
2480: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
2490: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
24a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
24b0: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  cture..**.** Pag
24c0: 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62  er.errCode may b
24d0: 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  e set to SQLITE_
24e0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
24f0: 52 52 55 50 54 2c 20 53 51 4c 49 54 45 5f 50 52  RRUPT, SQLITE_PR
2500: 4f 54 4f 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c  OTOCOL.** or SQL
2510: 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f  ITE_FULL. Once o
2520: 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ne of the first 
2530: 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63  three errors occ
2540: 75 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73  urs, it persists
2550: 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72  .** and is retur
2560: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
2570: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
2580: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
2590: 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f    The.** SQLITE_
25a0: 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65  FULL return code
25b0: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66   is slightly dif
25c0: 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69  ferent. It persi
25d0: 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74  sts only until t
25e0: 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65  he.** next succe
25f0: 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69  ssful rollback i
2600: 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74  s performed on t
2610: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
2620: 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  Also,.** SQLITE_
2630: 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66  FULL does not af
2640: 66 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33  fect the sqlite3
2650: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
2660: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
2670: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
2680: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
2690: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
26a0: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
26b0: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
26c0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
26d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
26e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
26f0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
2700: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2710: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2720: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2730: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2740: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2750: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2770: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2780: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2790: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
27a0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
27b0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
27c0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
27d0: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
27e0: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
27f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2800: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
2810: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
2820: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
2830: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
2840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
2850: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
2860: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
2870: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
2880: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
2890: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
28a0: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
28b0: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
28c0: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
28d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28e0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
28f0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
2900: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
2910: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
2920: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
2930: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
2940: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
2950: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
2960: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
2970: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2980: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
2990: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
29a0: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29c0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
29d0: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
29e0: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 65 72   etc. */.  u8 er
29f0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2a00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2a10: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
2a20: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38  f errors */.  u8
2a30: 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20   tempFile;      
2a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
2a50: 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70  lename is a temp
2a60: 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  orary file */.  
2a70: 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20  u8 readOnly;    
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a90: 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
2aa0: 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
2ab0: 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20    u8 needSync;  
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ad0: 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e   True if an fsyn
2ae0: 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  c() is needed on
2af0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
2b00: 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b    u8 dirtyCache;
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b20: 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20   True if cached 
2b30: 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67  pages have chang
2b40: 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ed */.  u8 alway
2b50: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
2b60: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64      /* Disable d
2b70: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
2b80: 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  or all pages */.
2b90: 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20    u8 memDb;     
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb0: 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74   True to inhibit
2bc0: 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f   all file I/O */
2bd0: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bf0: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
2c00: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
2c10: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
2c20: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b 20 20  .  int dbSize;  
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2c50: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  s in the file */
2c60: 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53 69 7a  .  int origDbSiz
2c70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2c80: 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65 20  * dbSize before 
2c90: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
2ca0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  ge */.  int stmt
2cb0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2cc0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
2cd0: 61 74 61 62 61 73 65 20 28 69 6e 20 70 61 67 65  atabase (in page
2ce0: 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  s) at stmt_begin
2cf0: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63  () */.  int nRec
2d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2d20: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
2d30: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  o the journal */
2d40: 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74  .  u32 cksumInit
2d50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d60: 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76  * Quasi-random v
2d70: 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76  alue added to ev
2d80: 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ery checksum */.
2d90: 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20    int stmtNRec; 
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2db0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
2dc0: 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f  ds in stmt subjo
2dd0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
2de0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
2df0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
2e00: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
2e10: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
2e20: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61  page */.  int pa
2e30: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
2e40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e50: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
2e60: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  ge */.  int nPag
2e70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2e80: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
2e90: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
2ea0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2eb0: 6e 4d 61 78 50 61 67 65 3b 20 20 20 20 20 20 20  nMaxPage;       
2ec0: 20 20 20 20 20 20 20 20 2f 2a 20 48 69 67 68 20          /* High 
2ed0: 77 61 74 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50  water mark of nP
2ee0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  age */.  int nRe
2ef0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2f00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f10: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2f20: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
2f30: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
2f40: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2f50: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2f60: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2f70: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
2f80: 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75   */.  u8 *aInJou
2f90: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
2fa0: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
2fb0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
2fc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fd0: 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74  */.  u8 *aInStmt
2fe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ff0: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
3000: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
3010: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
3020: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
3030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3040: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
3050: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
3060: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
3070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3080: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3090: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
30a0: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
30b0: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
30c0: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
30d0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
30e0: 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a  es */.  OsFile *
30f0: 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  fd, *jfd;       
3100: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
3110: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
3120: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
3130: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74   */.  OsFile *st
3140: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
3150: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
3160: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61  ptor for the sta
3170: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3180: 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65  l*/.  BusyHandle
3190: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
31a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
31b0: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
31c0: 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  er */.  PgHdr *p
31d0: 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20  First, *pLast;  
31e0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
31f0: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
3200: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
3210: 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ed;        /* Fi
3220: 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69  rst free page wi
3230: 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  th PgHdr.needSyn
3240: 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  c==0 */.  PgHdr 
3250: 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *pAll;          
3260: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3270: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3280: 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20  PgHdr *pStmt;   
3290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
32a0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
32b0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
32c0: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36  bjournal */.  i6
32d0: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
32e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
32f0: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
3300: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3310: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
3320: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
3330: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
3340: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
3350: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3360: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3370: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3380: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3390: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
33a0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
33b0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
33c0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
33d0: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
33e0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
33f0: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36   started */.  i6
3400: 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20  4 stmtJSize;    
3410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
3420: 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20  e of journal at 
3430: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
3440: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
3450: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3460: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
3470: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
3480: 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53  back */.#ifdef S
3490: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
34a0: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f   nHit, nMiss, nO
34b0: 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63 68  vfl;     /* Cach
34c0: 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c  e hits, missing,
34d0: 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f   and LRU overflo
34e0: 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ws */.  int nRea
34f0: 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  d,nWrite;       
3500: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
3510: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
3520: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
3530: 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f  oid (*xDestructo
3540: 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f  r)(void*,int); /
3550: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
3560: 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e 67  ine when freeing
3570: 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64   pages */.  void
3580: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76 6f   (*xReiniter)(vo
3590: 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43  id*,int);   /* C
35a0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
35b0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
35c0: 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20  pages */.  void 
35d0: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
35e0: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
35f0: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
3600: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
3610: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
3620: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
3630: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
3640: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
3650: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
3660: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
3670: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
3680: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
3690: 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23  er to PgHdr */.#
36a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
36b0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
36c0: 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70  EMENT.  Pager *p
36d0: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
36e0: 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69      /* Linked li
36f0: 73 74 20 6f 66 20 70 61 67 65 72 73 20 69 6e 20  st of pagers in 
3700: 74 68 69 73 20 74 68 72 65 61 64 20 2a 2f 0a 23  this thread */.#
3710: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
3720: 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 69  If SQLITE_TEST i
3730: 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 69  s defined then i
3740: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 72  ncrement the var
3750: 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a 2a  iable given in.*
3760: 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a 2a  * the argument.*
3770: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3780: 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54 45  TEST.# define TE
3790: 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b 0a  ST_INCR(x)  x++.
37a0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54  #else.# define T
37b0: 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e 64  EST_INCR(x).#end
37c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61  if../*.** Journa
37d0: 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69  l files begin wi
37e0: 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
37f0: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20   magic string.  
3800: 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20  The data.** was 
3810: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64  obtained from /d
3820: 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69  ev/random.  It i
3830: 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61  s used only as a
3840: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a   sanity check..*
3850: 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69  *.** Since versi
3860: 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f  on 2.8.0, the jo
3870: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
3880: 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c  tains additional
3890: 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b   sanity.** check
38a0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  ing information.
38b0: 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66    If the power f
38c0: 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a  ails while the j
38d0: 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a  ournal is begin.
38e0: 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69  ** written, semi
38f0: 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20  -random garbage 
3900: 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61  data might appea
3910: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
3920: 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70  .** file after p
3930: 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
3940: 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74  .  If an attempt
3950: 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a   is then made.**
3960: 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75   to roll the jou
3970: 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64  rnal back, the d
3980: 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65  atabase could be
3990: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65   corrupted.  The
39a0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73   additional.** s
39b0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64  anity checking d
39c0: 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ata is an attemp
39d0: 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  t to discover th
39e0: 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65  e garbage in the
39f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
3a00: 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ignore it..**.**
3a10: 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   The sanity chec
3a20: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3a30: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75   for the new jou
3a40: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73  rnal format cons
3a50: 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d  ists.** of a 32-
3a60: 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20  bit checksum on 
3a70: 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74  each page of dat
3a80: 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d  a.  The checksum
3a90: 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20   covers both.** 
3aa0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
3ab0: 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e  and the pPager->
3ac0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
3ad0: 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70  f data for the p
3ae0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73  age..** This cks
3af0: 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  um is initialize
3b00: 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61  d to a 32-bit ra
3b10: 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20  ndom value that 
3b20: 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a  appears in the.*
3b30: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72  * journal file r
3b40: 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68  ight after the h
3b50: 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64  eader.  The rand
3b60: 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69  om initializer i
3b70: 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20  s important,.** 
3b80: 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20  because garbage 
3b90: 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72  data that appear
3ba0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
3bb0: 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b  a journal is lik
3bc0: 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74  ely.** data that
3bd0: 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68   was once in oth
3be0: 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61  er files that ha
3bf0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65  ve now been dele
3c00: 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ted.  If the.** 
3c10: 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d  garbage data cam
3c20: 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65  e from an obsole
3c30: 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  te journal file,
3c40: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d   the checksums m
3c50: 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65  ight.** be corre
3c60: 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74  ct.  But by init
3c70: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65  ializing the che
3c80: 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20  cksum to random 
3c90: 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69  value which.** i
3ca0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20  s different for 
3cb0: 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77  every journal, w
3cc0: 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20  e minimize that 
3cd0: 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  risk..*/.static 
3ce0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
3cf0: 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  har aJournalMagi
3d00: 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20  c[] = {.  0xd9, 
3d10: 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39  0xd5, 0x05, 0xf9
3d20: 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78  , 0x20, 0xa1, 0x
3d30: 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a  63, 0xd7,.};../*
3d40: 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20  .** The size of 
3d50: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f  the header and o
3d60: 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  f each page in t
3d70: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
3d80: 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74  termined.** by t
3d90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63  he following mac
3da0: 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ros..*/.#define 
3db0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
3dc0: 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d  ager)  ((pPager-
3dd0: 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a  >pageSize) + 8).
3de0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
3df0: 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66  al header size f
3e00: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
3e10: 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68  n the future, th
3e20: 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73  is could be.** s
3e30: 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65  et to some value
3e40: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
3e50: 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20  isk controller. 
3e60: 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a  The important.**
3e70: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20   characteristic 
3e80: 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  is that it is th
3e90: 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61  e same size as a
3ea0: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f   disk sector..*/
3eb0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3ec0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
3ed0: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
3ee0: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
3ef0: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
3f00: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
3f10: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
3f20: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
3f30: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
3f40: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
3f50: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
3f60: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
3f70: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
3f80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
3f90: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
3fa0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
3fb0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
3fc0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
3fd0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
3fe0: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
3ff0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
4000: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
4010: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
4020: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
4030: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
4040: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
4050: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20  default size of 
4060: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a 2f  a disk sector.*/
4070: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
4080: 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a 0a  ECTOR_SIZE 512..
4090: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
40a0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
40b0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
40c0: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
40d0: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
40e0: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
40f0: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
4100: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
4110: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
4120: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
4130: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
4140: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
4150: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
4160: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
4170: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
4180: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
4190: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
41a0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
41b0: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
41c0: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
41d0: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
41e0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
41f0: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
4200: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
4210: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
4220: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
4230: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
4240: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
4250: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
4260: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
4270: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
4280: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4290: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
42a0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
42b0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
42c0: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
42d0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45  7483647../*.** E
42e0: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
42f0: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
4300: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
4310: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
4320: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
4330: 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f  t pager3_refinfo
4340: 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73  _enable = 0;.  s
4350: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
4360: 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a  _refinfo(PgHdr *
4370: 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  p){.    static i
4380: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
4390: 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69  if( !pager3_refi
43a0: 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74  nfo_enable ) ret
43b0: 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  urn;.    sqlite3
43c0: 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20  DebugPrintf(.   
43d0: 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64      "REFCNT: %4d
43e0: 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
43f0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
4400: 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
4410: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 0a 20  TA(p), p->nRef. 
4420: 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b     );.    cnt++;
4430: 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20     /* Something 
4440: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
4450: 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20  int on */.  }.# 
4460: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
4470: 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  )  pager_refinfo
4480: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
4490: 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65  ne REFINFO(X).#e
44a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
44b0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
44c0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
44d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
44e0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
44f0: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
4500: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
4510: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4520: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
4530: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
4540: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4550: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4560: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
4570: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
4580: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4590: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
45a0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
45b0: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20  OsFile *fd, u32 
45c0: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
45d0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
45e0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
45f0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
4600: 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20 69  sizeof(ac));.  i
4610: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4620: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
4630: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
4640: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
4650: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
4660: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4670: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4680: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4690: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
46a0: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
46b0: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
46c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
46d0: 75 74 33 32 62 69 74 73 28 63 68 61 72 20 2a 61  ut32bits(char *a
46e0: 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 61  c, u32 val){.  a
46f0: 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29  c[0] = (val>>24)
4700: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d   & 0xff;.  ac[1]
4710: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
4720: 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28  xff;.  ac[2] = (
4730: 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a  val>>8) & 0xff;.
4740: 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20    ac[3] = val & 
4750: 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  0xff;.}../*.** W
4760: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4770: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
4780: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
4790: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
47a0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
47b0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
47c0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
47d0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
47e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
47f0: 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ite32bits(OsFile
4800: 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a   *fd, u32 val){.
4810: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
4820: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
4830: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
4840: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
4850: 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ac, 4);.}../*.**
4860: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4870: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
4880: 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74   'offset' from t
4890: 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
48a0: 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65  ed by.** page he
48b0: 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61  ader 'p'..*/.sta
48c0: 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65  tic u32 retrieve
48d0: 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c  32bits(PgHdr *p,
48e0: 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20   int offset){.  
48f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
4900: 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73  c;.  ac = &((uns
4910: 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44  igned char*)PGHD
4920: 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66  R_TO_DATA(p))[of
4930: 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20  fset];.  return 
4940: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
4950: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
4960: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
4970: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
4980: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
4990: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
49a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
49b0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
49c0: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
49d0: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
49e0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
49f0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
4a00: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
4a10: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
4a20: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
4a30: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
4a40: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
4a50: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4a60: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
4a70: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4a80: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
4a90: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
4aa0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4ab0: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
4ac0: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
4ad0: 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52 4f  PT or SQLITE_PRO
4ae0: 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65 72  TOCOL,.** the er
4af0: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
4b00: 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73  istent. All subs
4b10: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
4b20: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a   on this Pager.*
4b30: 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  * will immediate
4b40: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
4b50: 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  me error code..*
4b60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
4b70: 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
4b80: 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
4b90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
4ba0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
4bb0: 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65  TE_FULL || pPage
4bc0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
4bd0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 0a  TE_OK );.  if( .
4be0: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46      rc==SQLITE_F
4bf0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 3d 3d 53  ULL ||.    rc==S
4c00: 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20  QLITE_IOERR ||. 
4c10: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f     rc==SQLITE_CO
4c20: 52 52 55 50 54 20 7c 7c 0a 20 20 20 20 72 63 3d  RRUPT ||.    rc=
4c30: 3d 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  =SQLITE_PROTOCOL
4c40: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
4c50: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
4c60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4c70: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
4c80: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
4c90: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
4ca0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
4cb0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
4cc0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
4cd0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
4ce0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
4cf0: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
4d00: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
4d10: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
4d20: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
4d30: 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  r *)PGHDR_TO_DAT
4d40: 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28  A(pPage);.  for(
4d50: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50  i=0; i<pPage->pP
4d60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
4d70: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
4d80: 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b   (hash+i)^pData[
4d90: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
4da0: 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   hash;.}../*.** 
4db0: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
4dc0: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
4dd0: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
4de0: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
4df0: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
4e00: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
4e10: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
4e20: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
4e30: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
4e40: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
4e50: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
4e60: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
4e70: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
4e80: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
4e90: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4ea0: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
4eb0: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
4ec0: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
4ed0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
4ee0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
4ef0: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
4f00: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
4f10: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
4f20: 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67   || MEMDB || pPg
4f30: 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20  ->dirty || .    
4f40: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d    pPg->pageHash=
4f50: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
4f60: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
4f70: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
4f80: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  AGE(x).#endif../
4f90: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
4fa0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
4fb0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
4fc0: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
4fd0: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
4fe0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
4ff0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
5000: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
5010: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
5020: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
5030: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
5040: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
5050: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
5060: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
5070: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
5080: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
5090: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
50a0: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
50b0: 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72  Free() *pzMaster
50c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
50d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
50e0: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
50f0: 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73  t *pzMaster is s
5100: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
5110: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
5120: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5130: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
5140: 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c  al(OsFile *pJrnl
5150: 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65  , char **pzMaste
5160: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5170: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
5180: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
5190: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
51a0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
51b0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
51c0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
51d0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
51e0: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  *pzMaster = 0;..
51f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5200: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
5210: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
5220: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
5230: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
5240: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5250: 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73  3OsSeek(pJrnl, s
5260: 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63  zJ-16);.  if( rc
5270: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5280: 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20  turn rc;. .  rc 
5290: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
52a0: 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  nl, &len);.  if(
52b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
52c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
52d0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
52e0: 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  Jrnl, &cksum);. 
52f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5300: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5310: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5320: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
5330: 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72  gic, 8);.  if( r
5340: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
5350: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
5360: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
5370: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5380: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5390: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
53a0: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
53b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
53c0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d  turn rc;..  *pzM
53d0: 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29  aster = (char *)
53e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
53f0: 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d  +1);.  if( !*pzM
5400: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  aster ){.    ret
5410: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5420: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5430: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
5440: 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  , *pzMaster, len
5450: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5460: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
5470: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
5480: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
5490: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  er = 0;.    retu
54a0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
54b0: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
54c0: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
54d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
54e0: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
54f0: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
5500: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70      cksum -= (*p
5510: 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d  zMaster)[i];.  }
5520: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
5530: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
5540: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
5550: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
5560: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
5570: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
5580: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
5590: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
55a0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
55b0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
55c0: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
55d0: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
55e0: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
55f0: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
5600: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
5610: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
5620: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
5630: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
5640: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
5650: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
5660: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a  .  }else{.    (*
5670: 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d  pzMaster)[len] =
5680: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
5690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
56a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
56b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
56c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
56d0: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
56e0: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
56f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
5700: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
5710: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
5720: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
5730: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
5740: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
5750: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
5760: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
5770: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
5780: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
5790: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
57a0: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
57f0: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5810: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5830: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
5850: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
5860: 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61  c int seekJourna
5870: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
5880: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
5890: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
58a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
58b0: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
58c0: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
58d0: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
58e0: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
58f0: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
5900: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
5910: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
5920: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5930: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
5940: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
5950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
5960: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
5970: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
5980: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
5990: 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b  nalOff = offset;
59a0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
59b0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
59c0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
59d0: 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a  rnalOff);.}../*.
59e0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
59f0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
5a00: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
5a10: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
5a20: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
5a30: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
5a40: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
5a50: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
5a60: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
5a70: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
5a80: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
5a90: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
5aa0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
5ab0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
5ac0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
5ad0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
5ae0: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
5af0: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
5b00: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
5b10: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
5b20: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
5b30: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
5b40: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
5b50: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
5b60: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
5b70: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
5b80: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
5b90: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
5ba0: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
5bb0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
5bc0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
5bd0: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
5be0: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
5bf0: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
5c00: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
5c10: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
5c20: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
5c30: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5c40: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
5c50: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
5c60: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 0a 20 20  lMagic)+16];..  
5c70: 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75  int rc = seekJou
5c80: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
5c90: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
5ca0: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
5cb0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
5cc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5cd0: 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  f;.  if( pPager-
5ce0: 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29  >stmtHdrOff==0 )
5cf0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
5d00: 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65  mtHdrOff = pPage
5d10: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20  r->journalHdr;. 
5d20: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
5d30: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
5d40: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5d50: 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a  );..  /* FIX ME:
5d60: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73   .  **.  ** Poss
5d70: 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72  ibly for a pager
5d80: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
5d90: 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
5da0: 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e  l magic should n
5db0: 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  ot.  ** be writt
5dc0: 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73  en until nRec is
5dd0: 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61   filled in as pa
5de0: 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a  rt of next syncJ
5df0: 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a  ournal(). .  **.
5e00: 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61    ** Actually ma
5e10: 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  ybe the whole jo
5e20: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f  urnal header sho
5e30: 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75  uld be delayed u
5e40: 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70  ntil that.  ** p
5e50: 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75  oint. Think abou
5e60: 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d  t this..  */.  m
5e70: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
5e80: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
5e90: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5ea0: 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e  ic));.  /* The n
5eb0: 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46  Rec Field. 0xFFF
5ec0: 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e  FFFFF for no-syn
5ed0: 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20  c journals. */. 
5ee0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
5ef0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
5f00: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
5f10: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66  er->noSync ? 0xf
5f20: 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
5f30: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
5f40: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
5f50: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
5f60: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  e3Randomness(siz
5f70: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
5f80: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
5f90: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
5fa0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
5fb0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
5fc0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
5fd0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
5fe0: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
5ff0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
6000: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
6010: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6020: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
6030: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
6040: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
6050: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
6060: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
6070: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
6080: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6090: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
60a0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
60b0: 72 53 69 7a 65 29 3b 0a 20 20 72 63 20 3d 20 73  rSize);.  rc = s
60c0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
60d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
60e0: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
60f0: 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er));..  /* The 
6100: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
6110: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
6120: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
6130: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
6140: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
6150: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
6160: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
6170: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
6180: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
6190: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
61a0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
61b0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
61c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
61d0: 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
61e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
61f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6200: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
6210: 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a  fd, "\000", 1);.
6220: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
6230: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6240: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6250: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
6260: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
6270: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
6280: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
6290: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
62a0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
62b0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
62c0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
62d0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
62e0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
62f0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
6300: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
6310: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
6320: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6330: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
6340: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
6350: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
6360: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
6370: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
6380: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
6390: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
63a0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
63b0: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
63c0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
63d0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
63e0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
63f0: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
6400: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
6410: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
6420: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
6430: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
6440: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6450: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
6460: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
6470: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
6480: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
6490: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
64a0: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
64b0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
64c0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
64d0: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
64e0: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
64f0: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
6500: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
6510: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
6520: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
6530: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
6540: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6550: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
6560: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
6570: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
6580: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
6590: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
65a0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
65b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
65c0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
65d0: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
65e0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
65f0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
6600: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
6610: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
6620: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6630: 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
6640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
6650: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6660: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
6670: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
6680: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
6690: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
66a0: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
66b0: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
66c0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20  zeof(aMagic));. 
66d0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
66e0: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63   rc;..  if( memc
66f0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6700: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6710: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
6720: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6730: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
6740: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6750: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65  Pager->jfd, pNRe
6760: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
6770: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6780: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6790: 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
67a0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
67b0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
67c0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
67d0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
67e0: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
67f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6800: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
6810: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
6820: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
6830: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
6840: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
6850: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
6860: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
6870: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
6880: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
6890: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
68a0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
68b0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
68c0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
68d0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
68e0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
68f0: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
6900: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
6910: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
6920: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
6930: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
6940: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
6950: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6960: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  s(pPager->jfd, (
6970: 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73  u32 *)&pPager->s
6980: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
6990: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
69a0: 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ;..  pPager->jou
69b0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
69c0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
69d0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
69e0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
69f0: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
6a00: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75  rnalOff);.  retu
6a10: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
6a20: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
6a30: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
6a40: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
6a50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
6a60: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
6a70: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
6a80: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
6a90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6aa0: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
6ab0: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
6ac0: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
6ad0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
6ae0: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
6af0: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
6b00: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
6b10: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
6b20: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
6b30: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
6b40: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
6b50: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
6b60: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
6b70: 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  **.** + 4 bytes:
6b80: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
6b90: 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65  ** + N bytes: le
6ba0: 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
6bb0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20  ournal name..** 
6bc0: 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20  + 4 bytes: N.** 
6bd0: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
6be0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
6bf0: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20  hecksum..** + 8 
6c00: 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
6c10: 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
6c20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6c30: 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
6c40: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
6c50: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
6c60: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
6c70: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  name..**.** If z
6c80: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
6c90: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
6ca0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
6cb0: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
6cc0: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
6cd0: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
6ce0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
6cf0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
6d00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
6d10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
6d20: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
6d30: 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74   int len; .  int
6d40: 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d   i; .  u32 cksum
6d50: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
6d60: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
6d70: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
6d80: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
6d90: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
6da0: 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  er) return SQLIT
6db0: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
6dc0: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
6dd0: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a    len = strlen(z
6de0: 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69  Master);.  for(i
6df0: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
6e00: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
6e10: 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20  aster[i];.  }.. 
6e20: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
6e30: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
6e40: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
6e50: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
6e60: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
6e70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6e80: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
6e90: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
6ea0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
6eb0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
6ec0: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
6ed0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
6ee0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
6ef0: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
6f00: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
6f10: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
6f20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6f30: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6f40: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
6f50: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
6f60: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
6f70: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
6f80: 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a  r->jfd, PAGER_MJ
6f90: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
6fa0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6fb0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6fc0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6fd0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6fe0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
6ff0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
7000: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7010: 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74   rc;..  put32bit
7020: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
7030: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
7040: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
7050: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
7060: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
7070: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7080: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
7090: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
70a0: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
70b0: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
70c0: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
70d0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
70e0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
70f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7100: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
7110: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
7120: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
7130: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
7140: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
7150: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
7160: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
7170: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
7180: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
7190: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
71a0: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
71b0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
71c0: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
71d0: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
71e0: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
71f0: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
7200: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
7210: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
7220: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
7230: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
7240: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
7250: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
7260: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
7270: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64  ic void page_add
7280: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  _to_stmt_list(Pg
7290: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
72a0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
72b0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
72c0: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
72d0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
72e0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  pPg->pPrevStmt==
72f0: 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53  0 && pPg->pNextS
7300: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d  tmt==0 );.  pPg-
7310: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
7320: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
7330: 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  tmt ){.    pPage
7340: 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53  r->pStmt->pPrevS
7350: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  tmt = pPg;.  }. 
7360: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7370: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
7380: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
7390: 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69   = pPg;.  pPg->i
73a0: 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61  nStmt = 1;.}.sta
73b0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
73c0: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
73d0: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
73e0: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53  .  if( !pPg->inS
73f0: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
7400: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  if( pPg->pPrevSt
7410: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
7420: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
7430: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67  ->pNextStmt==pPg
7440: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
7450: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
7460: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
7470: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
7480: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
7490: 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67  ager->pStmt==pPg
74a0: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   );.    pPg->pPa
74b0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
74c0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
74d0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
74e0: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  tStmt ){.    ass
74f0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53  ert( pPg->pNextS
7500: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  tmt->pPrevStmt==
7510: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
7520: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
7530: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Stmt = pPg->pPre
7540: 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67  vStmt;.  }.  pPg
7550: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
7560: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
7570: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e  t = 0;.  pPg->in
7580: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
7590: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
75a0: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
75b0: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
75c0: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
75d0: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
75e0: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
75f0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
7600: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
7610: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
7620: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
7630: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
7640: 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  *p = pPager->aHa
7650: 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67  sh[pager_hash(pg
7660: 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  no)];.  while( p
7670: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
7680: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
7690: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
76a0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
76b0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
76c0: 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61  atabase and clea
76d0: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
76e0: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
76f0: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
7700: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
7710: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
7720: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
7730: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
7740: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
7750: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
7760: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
7770: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
7780: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
7790: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
77a0: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
77b0: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
77c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
77d0: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
77e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
77f0: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
7800: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
7810: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
7820: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
7830: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
7840: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
7850: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
7860: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
7870: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
7880: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
7890: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
78a0: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
78b0: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
78c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
78d0: 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ll = 0;.  memset
78e0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
78f0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
7900: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61  ->aHash));.  pPa
7910: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
7920: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7930: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
7940: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7950: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
7960: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7970: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7980: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7990: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
79a0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
79b0: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
79c0: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
79d0: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
79e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
79f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
7a00: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
7a10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7a20: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7a30: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7a40: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7a50: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
7a60: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
7a70: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7a80: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7a90: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
7aa0: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
7ab0: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7ac0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7ad0: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
7ae0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
7af0: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
7b00: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
7b10: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
7b20: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
7b30: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
7b40: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
7b50: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
7b60: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
7b70: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
7b80: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
7b90: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
7ba0: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
7bb0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
7bc0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
7bd0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
7be0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
7bf0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
7c00: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
7c10: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
7c20: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
7c30: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
7c40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7c50: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
7c60: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
7c70: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
7c80: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
7c90: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
7ca0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
7cb0: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
7cc0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
7cd0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
7ce0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7cf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7d00: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7d10: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
7d20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
7d30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
7d40: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
7d50: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
7d60: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
7d70: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
7d80: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
7d90: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
7da0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
7db0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
7dc0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
7dd0: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
7de0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
7df0: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
7e00: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
7e10: 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  nc = 0;.#ifdef S
7e20: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
7e30: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
7e40: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
7e50: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
7e60: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
7e70: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
7e80: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
7e90: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
7ea0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7eb0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
7ec0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
7ed0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
7ee0: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
7ef0: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
7f00: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63  l==0 );.  }.  rc
7f10: 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   = sqlite3OsUnlo
7f20: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
7f30: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70  HARED_LOCK);.  p
7f40: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
7f50: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 70  AGER_SHARED;.  p
7f60: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
7f70: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
7f80: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
7f90: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
7fa0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
7fb0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
7fc0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
7fd0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7fe0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
7ff0: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
8000: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
8010: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
8020: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
8030: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
8040: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
8050: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8060: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
8070: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
8080: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
8090: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
80a0: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
80b0: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
80c0: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
80d0: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
80e0: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
80f0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
8100: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
8110: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
8120: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
8130: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
8140: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8150: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
8160: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
8170: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
8180: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
8190: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
81a0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
81b0: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
81c0: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
81d0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
81e0: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
81f0: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
8200: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
8210: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
8220: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
8230: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
8240: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
8250: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
8260: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
8270: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
8280: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
8290: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
82a0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
82b0: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
82c0: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
82d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
82e0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
82f0: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
8300: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
8310: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
8320: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
8330: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
8340: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
8350: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
8360: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
8370: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
8380: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
8390: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
83a0: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
83b0: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
83c0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
83d0: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
83e0: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
83f0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
8400: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
8410: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
8420: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
8430: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
8440: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
8450: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
8460: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
8470: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
8480: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
8490: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
84a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
84b0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
84c0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
84d0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
84e0: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
84f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8500: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
8510: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
8520: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
8530: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
8540: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
8550: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
8560: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
8570: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
8580: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
8590: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
85a0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
85b0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
85c0: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
85d0: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
85e0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
85f0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
8600: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8610: 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74  OsFile *jfd, int
8620: 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e   useCksum){.  in
8630: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
8640: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
8650: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
8660: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
8670: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
8680: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
8690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
86a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
86b0: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
86c0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
86d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
86e0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
86f0: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
8700: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
8710: 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d  8 aData[SQLITE_M
8720: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20  AX_PAGE_SIZE];  
8730: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
8740: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
8750: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
8760: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
8770: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
8780: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
8790: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
87a0: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
87b0: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
87c0: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
87d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
87e0: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
87f0: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
8800: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 0a 0a  ger->stfd) );...
8810: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
8820: 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20  s(jfd, &pgno);. 
8830: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8840: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8860: 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61  Read(jfd, &aData
8870: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8880: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
8890: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
88a0: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
88b0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
88c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
88d0: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
88e0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
88f0: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
8900: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
8910: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
8920: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
8930: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
8940: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
8950: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8960: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
8970: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
8980: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
8990: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
89a0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
89b0: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
89c0: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
89d0: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
89e0: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
89f0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8a00: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
8a10: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
8a20: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
8a30: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8a40: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8a50: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
8a60: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
8a70: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8a80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8a90: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
8aa0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
8ab0: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b  d32bits(jfd, &ck
8ac0: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
8ad0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
8ae0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8af0: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69  lOff += 4;.    i
8b00: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
8b10: 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63  Pager, aData)!=c
8b20: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  ksum ){.      re
8b30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8b40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
8b50: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
8b60: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
8b70: 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  RVED || pPager->
8b80: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
8b90: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
8ba0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
8bb0: 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74  in RESERVED stat
8bc0: 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
8bd0: 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
8be0: 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
8bf0: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
8c00: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
8c10: 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
8c20: 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
8c30: 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
8c40: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
8c50: 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
8c60: 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
8c70: 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ase..  **.  ** I
8c80: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
8c90: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
8ca0: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
8cb0: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
8cc0: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
8cd0: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
8ce0: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
8cf0: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
8d00: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
8d10: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
8d20: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
8d30: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
8d40: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
8d50: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
8d60: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
8d70: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
8d80: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
8d90: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
8da0: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
8db0: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
8dc0: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
8dd0: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
8de0: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
8df0: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
8e00: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
8e10: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
8e20: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
8e30: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
8e40: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
8e50: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
8e60: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
8e70: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
8e80: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
8e90: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
8ea0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   in the main rol
8eb0: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
8ec0: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
8ed0: 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41  if a full ROLLBA
8ee0: 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  CK occurs after 
8ef0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  the statement.  
8f00: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** rollback the 
8f10: 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69  full ROLLBACK wi
8f20: 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74  ll not restore t
8f30: 68 65 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f  he page to its o
8f40: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e  riginal.  ** con
8f50: 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69  tent.  Two condi
8f60: 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65  tions must be me
8f70: 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
8f80: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
8f90: 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29  .  ** files. (1)
8fa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
8fb0: 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28  st be locked.  (
8fc0: 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
8fd0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
8fe0: 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  * page content i
8ff0: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
9000: 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
9010: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
9020: 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63   not in.  ** cac
9030: 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73  he or else it is
9040: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
9050: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70  ync==0..  */.  p
9060: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
9070: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
9080: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9090: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
90a0: 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67  EXCLUSIVE || pPg
90b0: 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33 28  !=0 );.  TRACE3(
90c0: 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
90d0: 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
90e0: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b  (pPager), pgno);
90f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9100: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
9110: 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30  USIVE && (pPg==0
9120: 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   || pPg->needSyn
9130: 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20  c==0) ){.    rc 
9140: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
9150: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
9160: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
9170: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9180: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9190: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
91a0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
91b0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
91c0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
91d0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
91e0: 69 66 28 20 70 50 67 20 29 20 70 50 67 2d 3e 64  if( pPg ) pPg->d
91f0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
9200: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
9210: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
9220: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
9230: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
9240: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
9250: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
9260: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
9270: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
9280: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
9290: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
92a0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
92b0: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
92c0: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
92d0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
92e0: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
92f0: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
9300: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
9310: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
9320: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
9330: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
9340: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
9350: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
9360: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
9370: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
9380: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
9390: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
93a0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
93b0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
93c0: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
93d0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
93e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
93f0: 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a  estructor ){  /*
9400: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75  ** FIX ME:  Shou
9410: 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e  ld this be xRein
9420: 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70  it? ***/.      p
9430: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
9440: 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72  or(pData, pPager
9450: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9460: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
9470: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
9480: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
9490: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
94a0: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
94b0: 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
94c0: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
94d0: 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 3);.  }.  retu
94e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
94f0: 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
9500: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
9510: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
9520: 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
9530: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
9540: 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
9550: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
9560: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
9570: 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
9580: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
9590: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
95a0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
95b0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
95c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
95d0: 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
95e0: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
95f0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
9600: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
9610: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
9620: 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  l child journals
9630: 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20  ..** To tell if 
9640: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
9650: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c   can be deleted,
9660: 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f   check to each o
9670: 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65  f the.** childre
9680: 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64  n.  If all child
9690: 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d  ren are either m
96a0: 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74  issing or do not
96b0: 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64   refer to.** a d
96c0: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20  ifferent master 
96d0: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68  journal, then th
96e0: 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  is master journa
96f0: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
9700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9710: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
9720: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
9730: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
9740: 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65    int master_ope
9750: 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20  n = 0;.  OsFile 
9760: 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63  *master = 0;.  c
9770: 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
9780: 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
9790: 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
97a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
97b0: 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
97c0: 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
97d0: 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
97e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
97f0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
9800: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9810: 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63  exclusively in c
9820: 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ase some other p
9830: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72  rocess.  ** is r
9840: 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74  unning this rout
9850: 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68  ine also. Not th
9860: 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20  at it makes too 
9870: 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e  much difference.
9880: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
9890: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
98a0: 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73  ly(zMaster, &mas
98b0: 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ter);.  if( rc!=
98c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
98d0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
98e0: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
98f0: 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
9900: 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73 74  3OsFileSize(mast
9910: 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
9920: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
9930: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
9940: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9950: 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
9960: 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
9970: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
9980: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
9990: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  Ptr = 0;..    /*
99a0: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
99b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
99c0: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
99d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
99e0: 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f    ** sqliteMallo
99f0: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
9a00: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
9a10: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
9a20: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
9a30: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
9a40: 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  eMalloc(nMasterJ
9a50: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
9a60: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
9a70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
9a80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9a90: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
9aa0: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
9ab0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
9ac0: 65 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73  ead(master, zMas
9ad0: 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73  terJournal, nMas
9ae0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
9af0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9b00: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
9b10: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a  ter_out;..    zJ
9b20: 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
9b30: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
9b40: 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
9b50: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
9b60: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
9b70: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9b80: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a  3OsFileExists(zJ
9b90: 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
9ba0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
9bb0: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
9bc0: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
9bd0: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
9be0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
9bf0: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
9c00: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
9c10: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9c20: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
9c30: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
9c40: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
9c50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9c60: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
9c70: 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65  /.        OsFile
9c80: 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20   *journal = 0;. 
9c90: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20         int c;.. 
9ca0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
9cb0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
9cc0: 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75  y(zJournal, &jou
9cd0: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
9ce0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
9d00: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
9d10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
9d20: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
9d30: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72  sterJournal(jour
9d40: 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72  nal, &zMasterPtr
9d50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9d60: 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e  e3OsClose(&journ
9d70: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
9d80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9d90: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
9da0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9db0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
9dc0: 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
9dd0: 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  r!=0 && strcmp(z
9de0: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
9df0: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
9e00: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
9e10: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
9e20: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
9e30: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
9e40: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
9e50: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
9e60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
9e70: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
9e80: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9e90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9ea0: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
9eb0: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
9ec0: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
9ed0: 20 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f   }.  .  sqlite3O
9ee0: 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29  sDelete(zMaster)
9ef0: 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
9f00: 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a  :.  if( zMasterJ
9f10: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71  ournal ){.    sq
9f20: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
9f30: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
9f40: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
9f50: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
9f60: 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29  OsClose(&master)
9f70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9f80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
9f90: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
9fa0: 68 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77  he cache agree w
9fb0: 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64  ith what is on d
9fc0: 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  isk.  In other w
9fd0: 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20  ords,.** reread 
9fe0: 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65  the disk to rese
9ff0: 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  t the state of t
a000: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
a010: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a020: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72  called after a r
a030: 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68  ollback in which
a040: 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72   some of the dir
a050: 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65  ty cache.** page
a060: 73 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e  s had never been
a070: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
a080: 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74  disk.  We need t
a090: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a  o roll back the.
a0a0: 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74  ** cache content
a0b0: 20 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74   and the easiest
a0c0: 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20   way to do that 
a0d0: 69 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65  is to reread the
a0e0: 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   old content.** 
a0f0: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69  back from the di
a100: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sk..*/.static in
a110: 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  t pager_reload_c
a120: 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67  ache(Pager *pPag
a130: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
a140: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
a150: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70  LITE_OK;.  for(p
a160: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
a170: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
a180: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68  NextAll){.    ch
a190: 61 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d  ar zBuf[SQLITE_M
a1a0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20  AX_PAGE_SIZE];. 
a1b0: 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72     if( !pPg->dir
a1c0: 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ty ) continue;. 
a1d0: 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
a1e0: 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
a1f0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
a200: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
a210: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
a220: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
a230: 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e  Size*(i64)(pPg->
a240: 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20  pgno-1));.      
a250: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
a260: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
a270: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
a280: 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
a290: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a2a0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
a2b0: 20 20 20 54 52 41 43 45 33 28 22 52 45 46 45 54     TRACE3("REFET
a2c0: 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  CH %d page %d\n"
a2d0: 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
a2e0: 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
a2f0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
a300: 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  eak;.      CODEC
a310: 31 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20  1(pPager, zBuf, 
a320: 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20  pPg->pgno, 2);. 
a330: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a340: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
a350: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a360: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a370: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
a380: 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47   memcmp(zBuf, PG
a390: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a3a0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a3b0: 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ze) ){.      mem
a3c0: 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
a3d0: 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50  A(pPg), zBuf, pP
a3e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a3f0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
a400: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
a410: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
a420: 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f  xReiniter(PGHDR_
a430: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
a440: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a450: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a460: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
a470: 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
a480: 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
a490: 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
a4a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
a4b0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
a4c0: 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  0;.    pPg->dirt
a4d0: 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
a4e0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
a4f0: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
a500: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
a510: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
a520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
a540: 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  ate the main fil
a550: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  e of the given p
a560: 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62  ager to the numb
a570: 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69  er of pages.** i
a580: 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61  ndicated..*/.sta
a590: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
a5a0: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
a5b0: 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29  ager, int nPage)
a5c0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
a5d0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
a5e0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
a5f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
a600: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
a610: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
a620: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
a630: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  );.}../*.** Play
a640: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
a650: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
a660: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
a670: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
a680: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
a690: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
a6a0: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
a6b0: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
a6c0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
a6d0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
a6e0: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
a6f0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
a700: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
a710: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
a720: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
a730: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
a740: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
a750: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
a760: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
a770: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
a780: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
a790: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
a7a0: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
a7b0: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
a7c0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
a7d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
a7e0: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
a7f0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
a800: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
a810: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
a820: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
a830: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
a840: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
a850: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
a860: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
a870: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
a880: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
a890: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
a8a0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
a8b0: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
a8c0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
a8d0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
a8e0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
a8f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
a900: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
a910: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
a920: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
a930: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
a940: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
a950: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
a960: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
a970: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
a980: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
a990: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
a9a0: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
a9b0: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
a9c0: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
a9d0: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
a9e0: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
a9f0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
aa00: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
aa10: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
aa20: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
aa30: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
aa40: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
aa50: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
aa60: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
aa70: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
aa80: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
aa90: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
aaa0: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
aab0: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
aac0: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
aad0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
aae0: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
aaf0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
ab00: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
ab10: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
ab20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
ab30: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
ab40: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
ab50: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
ab60: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
ab70: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
ab80: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
ab90: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
aba0: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
abb0: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
abc0: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
abd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
abe0: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
abf0: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
ac00: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
ac10: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
ac20: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
ac30: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
ac40: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
ac50: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
ac60: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
ac70: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
ac80: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
ac90: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
aca0: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
acb0: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
acc0: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
acd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ace0: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
acf0: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
ad00: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
ad10: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
ad20: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
ad30: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
ad40: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
ad50: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
ad60: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
ad70: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
ad80: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
ad90: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
ada0: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
adb0: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
adc0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
add0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
ade0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
adf0: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
ae00: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
ae10: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
ae20: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
ae30: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
ae40: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
ae50: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
ae60: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
ae70: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
ae80: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
ae90: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
aea0: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
aeb0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
aec0: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
aed0: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
aee0: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
aef0: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
af00: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
af10: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
af20: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
af30: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
af40: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
af50: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
af60: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
af70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
af80: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
af90: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
afa0: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
afb0: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
afc0: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
afd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
afe0: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
aff0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
b000: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
b010: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
b020: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
b030: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
b040: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
b050: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
b060: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
b070: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
b080: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
b090: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
b0a0: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
b0b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
b0c0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
b0d0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
b0e0: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
b0f0: 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  ger){.  i64 szJ;
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
b120: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
b130: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
b140: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
b150: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b160: 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
b170: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
b180: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
b190: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b1a0: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
b1b0: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
b1c0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
b1d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
b1e0: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
b1f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
b200: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
b210: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
b220: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
b230: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
b240: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
b250: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
b260: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
b270: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
b280: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
b290: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
b2a0: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
b2b0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
b2c0: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
b2d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
b2e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
b2f0: 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
b300: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
b310: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
b320: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b330: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
b340: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
b350: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
b360: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b370: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
b380: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
b390: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
b3a0: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
b3b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
b3c0: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
b3d0: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
b3e0: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
b3f0: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
b400: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
b410: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
b420: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
b430: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
b440: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
b450: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
b460: 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29  ->jfd, &zMaster)
b470: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
b480: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
b490: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b4a0: 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26  OK || (zMaster &
b4b0: 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  & !sqlite3OsFile
b4c0: 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29  Exists(zMaster))
b4d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
b4e0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
b4f0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
b500: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b510: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
b520: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
b530: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
b540: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
b550: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
b560: 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  0);.  pPager->jo
b570: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
b580: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
b590: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
b5a0: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
b5b0: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
b5c0: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
b5d0: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
b5e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
b5f0: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
b600: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
b610: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
b620: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
b630: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
b640: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
b650: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
b660: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
b670: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
b680: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
b690: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
b6a0: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
b6b0: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
b6c0: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
b6d0: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
b6e0: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
b6f0: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
b700: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
b710: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
b720: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
b730: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
b740: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
b750: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
b760: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
b770: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
b780: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
b790: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
b7a0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
b7b0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b7c0: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
b7d0: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
b7e0: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
b7f0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
b800: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
b810: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
b820: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
b830: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
b840: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
b850: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
b860: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
b870: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
b880: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
b890: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
b8a0: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
b8b0: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
b8c0: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
b8d0: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
b8e0: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
b8f0: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
b900: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
b910: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
b920: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
b930: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
b940: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
b950: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
b960: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
b970: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
b980: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
b990: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
b9a0: 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
b9b0: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
b9c0: 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
b9d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
b9e0: 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69  ck to it's origi
b9f0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
ba00: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
ba10: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
ba20: 43 4c 55 53 49 56 45 20 26 26 20 0a 20 20 20 20  CLUSIVE && .    
ba30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
ba40: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
ba50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
ba60: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ba70: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
ba80: 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ze==0 || pPager-
ba90: 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50  >origDbSize==mxP
baa0: 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g );.      rc = 
bab0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
bac0: 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
bad0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bae0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
baf0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
bb00: 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
bb10: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
bb20: 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
bb30: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
bb40: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
bb50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
bb60: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
bb70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
bb80: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
bb90: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
bba0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
bbb0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
bbc0: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
bbd0: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
bbe0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bbf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
bc00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
bc10: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
bc20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
bc30: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
bc40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
bc50: 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
bc60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
bc70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
bc80: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
bc90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bca0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
bcb0: 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
bcc0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
bcd0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
bce0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bcf0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
bd00: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
bd10: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
bd20: 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( zMaster ){.   
bd30: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
bd40: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
bd50: 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
bd60: 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74  ne will return t
bd70: 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20  rue,.    ** see 
bd80: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
bd90: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
bda0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  master journal..
bdb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
bdc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bdd0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
bde0: 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74  _delmaster(zMast
bdf0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
be00: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
be10: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  r);.  }..  /* Th
be20: 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
be30: 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
be40: 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
be50: 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
be60: 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
be70: 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
be80: 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
be90: 64 69 66 66 65 72 65 6e 74 20 50 41 47 45 52 5f  different PAGER_
bea0: 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a  SECTOR_SIZE.  **
beb0: 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
bec0: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
bed0: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
bee0: 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70  rocess..  */.  p
bef0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
bf00: 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52  e = PAGER_SECTOR
bf10: 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20  _SIZE;.  return 
bf20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
bf30: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
bf40: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
bf50: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
bf60: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
bf70: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
bf80: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
bf90: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
bfa0: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
bfb0: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
bfc0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
bfd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bfe0: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
bff0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
c000: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
c010: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
c020: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
c030: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
c040: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
c050: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
c060: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
c070: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
c080: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
c090: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
c0a0: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
c0b0: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
c0c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
c0d0: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
c0e0: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
c0f0: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
c100: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
c110: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
c120: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
c130: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
c140: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
c150: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
c160: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
c170: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
c180: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
c190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c1a0: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
c1b0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c1d0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
c1e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
c1f0: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
c200: 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20  nalOff;.#ifndef 
c210: 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20  NDEBUG .  {.    
c220: 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  i64 os_szJ;.    
c230: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
c240: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
c250: 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
c260: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c270: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c280: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
c290: 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
c2a0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
c2b0: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
c2c0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
c2d0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
c2e0: 61 64 65 72 20 77 72 69 74 74 65 6e 0a 20 20 2a  ader written.  *
c2f0: 2a 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * this statement
c300: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72   transaction, or
c310: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c320: 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e  file if no journ
c330: 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77  al.  ** header w
c340: 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  as written..  */
c350: 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67  .  hdrOff = pPag
c360: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a  er->stmtHdrOff;.
c370: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c380: 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68  ->fullSync || !h
c390: 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21  drOff );.  if( !
c3a0: 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64  hdrOff ){.    hd
c3b0: 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  rOff = szJ;.  }.
c3c0: 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65    .  /* Truncate
c3d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
c3e0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
c3f0: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
c400: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
c410: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
c420: 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  VE ){.    rc = p
c430: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
c440: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
c450: 6d 74 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70  mtSize);.  }.  p
c460: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
c470: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
c480: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
c490: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
c4a0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  rds are in the s
c4b0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c4c0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
c4d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
c4e0: 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  se && pPager->jo
c4f0: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
c500: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
c510: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
c520: 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e   nRec = pPager->
c530: 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f  stmtNRec;.  .  /
c540: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
c550: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
c560: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
c570: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
c580: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
c590: 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74  se file.  Note t
c5a0: 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
c5b0: 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20  t journal omits 
c5c0: 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20  checksums from. 
c5d0: 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20   ** each record 
c5e0: 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c  since power-fail
c5f0: 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20  ure recovery is 
c600: 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  not important to
c610: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
c620: 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
c630: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
c640: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
c650: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
c660: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
c670: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
c680: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
c690: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
c6a0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
c6b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
c6c0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
c6d0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
c6e0: 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
c6f0: 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
c700: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
c710: 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
c720: 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
c730: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c740: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c750: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
c760: 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
c770: 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
c780: 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
c790: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
c7a0: 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
c7b0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
c7c0: 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
c7d0: 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
c7e0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
c7f0: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
c800: 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
c810: 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
c820: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
c830: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
c840: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
c850: 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
c860: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
c870: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
c880: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
c890: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
c8a0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
c8b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c8c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
c8d0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
c8e0: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
c8f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c900: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
c910: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
c920: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
c930: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61  ->stmtCksum;.  a
c940: 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48  ssert( JOURNAL_H
c950: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28 70  DR_SZ(pPager)<(p
c960: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
c970: 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  8) );.  while( p
c980: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c990: 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70 50  f <= (hdrOff-(pP
c9a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
c9b0: 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  )) ){.    rc = p
c9c0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
c9d0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
c9e0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
c9f0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
ca00: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
ca10: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ca20: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
ca30: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
ca40: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61   }..  while( pPa
ca50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ca60: 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  < szJ ){.    u32
ca70: 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20   nJRec;         
ca80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
ca90: 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
caa0: 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
cab0: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
cac0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
cad0: 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
cae0: 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  my);.    if( rc!
caf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cb00: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
cb10: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
cb20: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74       goto end_st
cb30: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
cb40: 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63   }.    if( nJRec
cb50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52  ==0 ){.      nJR
cb60: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
cb70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
cb80: 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  / (pPager->pageS
cb90: 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20  ize+8);.    }.  
cba0: 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b    for(i=nJRec-1;
cbb0: 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
cbc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
cbd0: 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
cbe0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
cbf0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
cc00: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
cc10: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
cc20: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
cc30: 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
cc40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
cc50: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
cc60: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
cc70: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
cc80: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
cc90: 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
cca0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
ccb0: 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20  QLITE_OK) {.    
ccc0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ccd0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a  ff = szJ;.    /*
cce0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
ccf0: 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  che(pPager); */.
cd00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cd10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
cd20: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
cd30: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
cd40: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
cd50: 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
cd60: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
cd70: 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61 67 65  t_cachesize(Page
cd80: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
cd90: 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
cda0: 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70  Page>10 ){.    p
cdb0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
cdc0: 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b  mxPage;.  }else{
cdd0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
cde0: 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a  age = 10;.  }.}.
cdf0: 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
ce00: 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
ce10: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
ce20: 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
ce30: 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
ce40: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
ce50: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
ce60: 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
ce70: 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
ce80: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
ce90: 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
cea0: 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
ceb0: 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
cec0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
ced0: 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
cee0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
cef0: 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
cf00: 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
cf10: 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
cf20: 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
cf30: 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
cf40: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
cf50: 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
cf60: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
cf70: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
cf80: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
cf90: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
cfa0: 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
cfb0: 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
cfc0: 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
cfd0: 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
cfe0: 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
cff0: 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
d010: 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
d020: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
d030: 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
d040: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
d050: 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
d060: 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
d070: 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
d080: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
d090: 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
d0a0: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
d0b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
d0c0: 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
d0d0: 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
d0e0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
d0f0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d110: 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
d120: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
d130: 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
d140: 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
d150: 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
d160: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
d170: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
d180: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
d190: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
d1a0: 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
d1b0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
d1c0: 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
d1d0: 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
d1e0: 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
d1f0: 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
d200: 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
d220: 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
d230: 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
d240: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
d250: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d260: 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
d270: 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
d280: 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
d290: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
d2a0: 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
d2b0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
d2c0: 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
d2d0: 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
d2e0: 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
d2f0: 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
d300: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
d310: 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
d320: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
d330: 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61 67  safety_level(Pag
d340: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d350: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f  level, int full_
d360: 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  fsync){.  pPager
d370: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
d380: 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
d390: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
d3a0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
d3b0: 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
d3c0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
d3d0: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
d3e0: 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b  nc = full_fsync;
d3f0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
d400: 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
d410: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
d420: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
d430: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
d440: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
d450: 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
d460: 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
d470: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
d480: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
d490: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
d4a0: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
d4b0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
d4c0: 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
d4d0: 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
d4e0: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
d4f0: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70  t = 0;../*.** Op
d500: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
d510: 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
d520: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
d530: 20 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a 2a 20 28   into zFile.** (
d540: 7a 46 69 6c 65 20 6d 75 73 74 20 62 65 20 61 74  zFile must be at
d550: 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45   least SQLITE_TE
d560: 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65  MPNAME_SIZE byte
d570: 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a  s long.)  Write.
d580: 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
d590: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
d5a0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
d5b0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
d5c0: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
d5d0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
d5e0: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
d5f0: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
d600: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
d610: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
d620: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
d630: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
d640: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
d650: 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a  _opentemp(char *
d660: 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 2a  zFile, OsFile **
d670: 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  pFd){.  int cnt 
d680: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
d690: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
d6a0: 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
d6b0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
d6c0: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
d6d0: 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 63  y */.  do{.    c
d6e0: 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt--;.    sqlite
d6f0: 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  3OsTempFileName(
d700: 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d  zFile);.    rc =
d710: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
d720: 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70  clusive(zFile, p
d730: 46 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65  Fd, 1);.  }while
d740: 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53  ( cnt>0 && rc!=S
d750: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
d760: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
d770: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d780: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
d790: 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
d7a0: 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
d7b0: 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
d7c0: 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
d7d0: 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
d7e0: 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
d7f0: 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
d800: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
d810: 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
d820: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
d830: 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e  e3pager_get() an
d840: 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f  d is only held o
d850: 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  pen until the.**
d860: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
d870: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
d880: 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
d890: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
d8a0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
d8b0: 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
d8c0: 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
d8d0: 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
d8e0: 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
d8f0: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
d900: 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
d910: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
d920: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
d930: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
d940: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
d950: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
d960: 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f  :" then all info
d970: 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
d980: 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20  in cache..** It 
d990: 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
d9a0: 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
d9b0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
d9c0: 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69  mplement an.** i
d9d0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
d9e0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
d9f0: 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50  3pager_open(.  P
da00: 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
da10: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
da20: 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
da30: 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
da40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
da50: 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
da60: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
da70: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
da80: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
da90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
daa0: 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
dab0: 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
dac0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
dad0: 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
dae0: 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
daf0: 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
db00: 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61   file */.){.  Pa
db10: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
db20: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61  .  char *zFullPa
db30: 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  thname = 0;.  in
db40: 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43  t nameLen;  /* C
db50: 6f 6d 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67  ompiler is wrong
db60: 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73  . This is always
db70: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66   initialized bef
db80: 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46  ore use */.  OsF
db90: 69 6c 65 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72  ile *fd;.  int r
dba0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
dbb0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65   int i;.  int te
dbc0: 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  mpFile = 0;.  in
dbd0: 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69  t memDb = 0;.  i
dbe0: 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
dbf0: 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
dc00: 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
dc10: 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
dc20: 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61  ==0;.  int noRea
dc30: 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
dc40: 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
dc50: 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a  CK)!=0;.  char z
dc60: 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
dc70: 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64  NAME_SIZE];.#ifd
dc80: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
dc90: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
dca0: 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  NT.  /* A malloc
dcb0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  () cannot fail i
dcc0: 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  n sqlite3ThreadD
dcd0: 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20  ata() as one or 
dce0: 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20  more calls to . 
dcf0: 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73   ** malloc() mus
dd00: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
dd10: 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73  een made by this
dd20: 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69   thread before i
dd30: 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74  t gets.  ** to t
dd40: 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20  his point. This 
dd50: 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64  means the Thread
dd60: 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62  Data must have b
dd70: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  een allocated al
dd80: 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68  ready.  ** so th
dd90: 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
dda0: 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e  lloc can be set.
ddb0: 20 49 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63   It would be nic
ddc0: 65 20 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a  e to assert.  **
ddd0: 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61   that ThreadData
dde0: 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a  .nAlloc is non-z
ddf0: 65 72 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68  ero, but alas th
de00: 69 73 20 62 72 65 61 6b 73 20 74 65 73 74 20 63  is breaks test c
de10: 61 73 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74  ases .  ** writt
de20: 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  en to invoke the
de30: 20 70 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e   pager directly.
de40: 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61  .  */.  ThreadDa
de50: 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74  ta *pTsd = sqlit
de60: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  e3ThreadData();.
de70: 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20 29    assert( pTsd )
de80: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
de90: 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 61  f malloc() has a
dea0: 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20 72 65  lready failed re
deb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
dec0: 4d 2e 20 42 65 66 6f 72 65 20 65 76 65 6e 0a 20  M. Before even. 
ded0: 20 2a 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20   ** testing for 
dee0: 74 68 69 73 2c 20 73 65 74 20 2a 70 70 50 61 67  this, set *ppPag
def0: 65 72 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68  er to NULL so th
df00: 65 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 20 74  e caller knows t
df10: 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 73 74  he pager.  ** st
df20: 72 75 63 74 75 72 65 20 77 61 73 20 6e 65 76 65  ructure was neve
df30: 72 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 20 20  r allocated. .  
df40: 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
df50: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
df60: 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29  MallocFailed() )
df70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
df80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
df90: 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20   memset(&fd, 0, 
dfa0: 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20  sizeof(fd));..  
dfb0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
dfc0: 72 20 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a  r file and set z
dfd0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20  FullPathname to 
dfe0: 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28  point at malloc(
dff0: 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  )ed .  ** memory
e000: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
e010: 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d  complete filenam
e020: 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e  e (i.e. includin
e030: 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 29  g the directory)
e040: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
e050: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
e060: 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65  ame[0] ){.#ifnde
e070: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
e080: 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
e090: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
e0a0: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
e0b0: 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
e0c0: 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61  1;.      zFullPa
e0d0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  thname = sqliteS
e0e0: 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d  trDup("");.    }
e0f0: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
e100: 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  {.      zFullPat
e110: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
e120: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
e130: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
e140: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
e150: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
e160: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
e170: 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61  eadWrite(zFullPa
e180: 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65  thname, &fd, &re
e190: 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d  adOnly);.      }
e1a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
e1b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e1c0: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
e1d0: 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20  Temp, &fd);.    
e1e0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d  zFilename = zTem
e1f0: 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  p;.    zFullPath
e200: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
e210: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
e220: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
e230: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e240: 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65  {.      tempFile
e250: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
e260: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
e270: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
e280: 72 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74  re. As part of t
e290: 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69  he same allocati
e2a0: 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a  on, allocate.  *
e2b0: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
e2c0: 66 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68  full paths of th
e2d0: 65 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72  e file, director
e2e0: 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20  y and journal . 
e2f0: 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65   ** (Pager.zFile
e300: 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72  name, Pager.zDir
e310: 65 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72  ectory and Pager
e320: 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f  .zJournal)..  */
e330: 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68  .  if( zFullPath
e340: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65  name ){.    name
e350: 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75  Len = strlen(zFu
e360: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e370: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
e380: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
e390: 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65  pPager) + nameLe
e3a0: 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 7d 0a  n*3 + 30 );.  }.
e3b0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
e3c0: 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74  r occured in eit
e3d0: 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
e3e0: 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
e3f0: 65 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70  e memory .  ** p
e400: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75  ointed to by zFu
e410: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65  llPathname, free
e420: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
e430: 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
e440: 68 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53  he .  ** file. S
e450: 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
e460: 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
e470: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
e480: 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
e490: 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
e4a0: 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
e4b0: 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
e4c0: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
e4d0: 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
e4e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
e4f0: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
e500: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
e510: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e520: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
e530: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  r);.    return (
e540: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f  (rc==SQLITE_OK)?
e550: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29  SQLITE_NOMEM:rc)
e560: 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 33 28  ;.  }..  TRACE3(
e570: 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
e580: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
e590: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
e5a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
e5b0: 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
e5c0: 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
e5d0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
e5e0: 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
e5f0: 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b  name[nameLen+1];
e600: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  .  pPager->zJour
e610: 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  nal = &pPager->z
e620: 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65  Directory[nameLe
e630: 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70  n+1];.  strcpy(p
e640: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
e650: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
e660: 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65  ;.  strcpy(pPage
e670: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a  r->zDirectory, z
e680: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a  FullPathname);..
e690: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
e6a0: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
e6b0: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
e6c0: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
e6d0: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
e6e0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
e6f0: 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70   = 0;.  strcpy(p
e700: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
e710: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e720: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
e730: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e740: 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e  strcpy(&pPager->
e750: 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e  zJournal[nameLen
e760: 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a  ], "-journal");.
e770: 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66    pPager->fd = f
e780: 64 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  d;.  /* pPager->
e790: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
e7a0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   */.  pPager->us
e7b0: 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
e7c0: 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
e7d0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
e7e0: 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
e7f0: 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
e800: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
e810: 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
e820: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
e830: 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
e840: 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
e850: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
e860: 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
e870: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
e880: 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  eSize = SQLITE_D
e890: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
e8a0: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
e8b0: 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
e8c0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
e8d0: 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
e8e0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
e8f0: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
e900: 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20  Pager->nMaxPage 
e910: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
e920: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a  ->mxPage = 100;.
e930: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
e940: 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f  UNLOCK==0 );.  /
e950: 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
e960: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
e970: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
e980: 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
e990: 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
e9a0: 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
e9b0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
e9c0: 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
e9d0: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
e9e0: 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
e9f0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
ea00: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
ea10: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
ea20: 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
ea30: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
ea40: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
ea50: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
ea60: 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  1);.  /* pPager-
ea70: 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
ea80: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
ea90: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
eaa0: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
eab0: 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
eac0: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
ead0: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
eae0: 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61 67 65  nExtra);.  pPage
eaf0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
eb00: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
eb10: 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  E;.  /* pPager->
eb20: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
eb30: 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
eb40: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
eb50: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
eb60: 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
eb70: 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
eb80: 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r;.#ifdef SQLITE
eb90: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
eba0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67  ANAGEMENT.  pPag
ebb0: 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64  er->pNext = pTsd
ebc0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64  ->pPager;.  pTsd
ebd0: 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
ebe0: 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  r;.#endif.  retu
ebf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ec00: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
ec10: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
ec20: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
ec30: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62  lite3pager_set_b
ec40: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
ec50: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
ec60: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
ec70: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
ec80: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
ec90: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
eca0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
ecb0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
ecc0: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
ecd0: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
ece0: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
ecf0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
ed00: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
ed10: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
ed20: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
ed30: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
ed40: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
ed50: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
ed60: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
ed70: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
ed80: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
ed90: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
eda0: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
edb0: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
edc0: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
edd0: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
ede0: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
edf0: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
ee00: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
ee10: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
ee20: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
ee30: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
ee40: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
ee50: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
ee60: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
ee70: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
ee80: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
ee90: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
eea0: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
eeb0: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
eec0: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
eed0: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
eee0: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
eef0: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
ef00: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
ef10: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
ef20: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
ef30: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
ef40: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
ef50: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
ef60: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
ef70: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
ef80: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
ef90: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
efa0: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
efb0: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
efc0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
efd0: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
efe0: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
eff0: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
f000: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
f010: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
f020: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
f030: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65  e page size.  Re
f040: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a  turn the new siz
f050: 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65  e.  If the sugge
f060: 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73  st new page.** s
f070: 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72  ize is inappropr
f080: 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
f090: 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
f0a0: 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a  ize is selected.
f0b0: 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e  ** and returned.
f0c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
f0d0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a  ager_set_pagesiz
f0e0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
f0f0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
f100: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
f110: 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
f120: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
f130: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69  PAGE_SIZE );.  i
f140: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
f150: 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
f160: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
f170: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Size;.  }.  retu
f180: 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  rn pPager->pageS
f190: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
f1a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
f1b0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
f1c0: 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
f1d0: 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
f1e0: 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
f1f0: 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
f200: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
f210: 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
f220: 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
f230: 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
f240: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
f250: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
f260: 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
f270: 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
f280: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
f290: 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
f2a0: 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
f2b0: 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
f2c0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
f2d0: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
f2e0: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
f2f0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
f300: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
f310: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
f320: 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65  ed_cnt;.void cle
f330: 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  ar_simulated_io_
f340: 65 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74  error(){.  sqlit
f350: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20  e3_io_error_hit 
f360: 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61  = 0;.}.void disa
f370: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
f380: 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
f390: 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
f3a0: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
f3b0: 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
f3c0: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
f3d0: 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
f3e0: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
f3f0: 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
f400: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
f410: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
f420: 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
f430: 0a 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f  .# define clear_
f440: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
f450: 6f 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69  or().# define di
f460: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
f470: 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
f480: 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
f490: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
f4a0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
f4b0: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
f4c0: 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
f4d0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
f4e0: 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
f4f0: 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
f500: 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
f510: 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
f520: 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
f530: 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
f540: 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
f550: 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
f560: 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
f570: 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
f580: 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
f590: 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
f5a0: 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
f5b0: 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
f5c0: 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
f5d0: 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
f5e0: 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
f5f0: 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
f600: 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
f610: 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
f620: 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
f630: 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
f640: 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
f650: 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
f660: 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
f670: 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
f680: 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  s)..*/.void sqli
f690: 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69  te3pager_read_fi
f6a0: 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
f6b0: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
f6c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
f6d0: 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  est){.  memset(p
f6e0: 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
f6f0: 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
f700: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
f710: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
f720: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
f730: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
f740: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  0);.    sqlite3O
f750: 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
f760: 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20  , pDest, N);.   
f770: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
f780: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
f790: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
f7a0: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
f7b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
f7c0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
f7d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
f7e0: 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   pPager. .**.** 
f7f0: 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42  If the PENDING_B
f800: 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20  YTE lies on the 
f810: 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66  page directly af
f820: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
f830: 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  he.** file, then
f840: 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70   consider this p
f850: 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  age part of the 
f860: 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78  file too. For ex
f870: 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e  ample, if.** PEN
f880: 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74  DING_BYTE is byt
f890: 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73  e 4096 (the firs
f8a0: 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35  t byte of page 5
f8b0: 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  ) and the size o
f8c0: 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  f the.** file is
f8d0: 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69   4096 bytes, 5 i
f8e0: 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
f8f0: 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20  ad of 4..*/.int 
f900: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
f910: 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
f920: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
f930: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f940: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
f950: 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
f960: 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
f970: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
f980: 73 65 20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  se {.    if( sql
f990: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
f9a0: 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d  Pager->fd, &n)!=
f9b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f9c0: 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
f9d0: 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 49 4f  Pager, SQLITE_IO
f9e0: 45 52 52 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ERR);.      retu
f9f0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
fa00: 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
fa10: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
fa20: 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  .      n = 1;.  
fa30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
fa40: 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
fa50: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
fa60: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
fa70: 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
fa80: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
fa90: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  >dbSize = n;.   
faa0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
fab0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  (PENDING_BYTE/pP
fac0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
fad0: 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
fae0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
faf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fb00: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
fb10: 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
fb20: 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
fb30: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
fb40: 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
fb50: 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
fb60: 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  teFree(pHist->pO
fb70: 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  rig);.  sqliteFr
fb80: 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
fb90: 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
fba0: 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
fbb0: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73  Stmt = 0;.}.#els
fbc0: 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48  e.#define clearH
fbd0: 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66  istory(x).#endif
fbe0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
fbf0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
fc00: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
fc10: 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
fc20: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  /*.** Unlink pPg
fc30: 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20   from it's hash 
fc40: 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20  chain. Also set 
fc50: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
fc60: 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65  to 0 to indicate
fc70: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
fc80: 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  e is not part of
fc90: 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e   any hash chain.
fca0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
fcb0: 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  d because the.**
fcc0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f   sqlite3pager_mo
fcd0: 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
fce0: 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
fcf0: 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
fd00: 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
fd10: 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
fd20: 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
fd30: 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
fd40: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
fd50: 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
fd60: 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
fd70: 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
fd80: 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
fd90: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
fda0: 6e 75 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c 20  number is zero, 
fdb0: 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69  then this page i
fdc0: 73 20 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61 73  s not in any has
fdd0: 68 20 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20  h chain. */.    
fde0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
fdf0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
fe00: 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
fe10: 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
fe20: 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
fe30: 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  sh;.  }.  if( pP
fe40: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a  g->pPrevHash ){.
fe50: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
fe60: 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f  er->aHash[pager_
fe70: 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d  hash(pPg->pgno)]
fe80: 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  !=pPg );.    pPg
fe90: 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
fea0: 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
feb0: 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
fec0: 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61  {.    int h = pa
fed0: 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67  ger_hash(pPg->pg
fee0: 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
fef0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
ff00: 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]==pPg );.    pP
ff10: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
ff20: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
ff30: 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
ff40: 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73   ){.    clearHis
ff50: 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49  tory(PGHDR_TO_HI
ff60: 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29  ST(pPg, pPager))
ff70: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e  ;.  }.  pPg->pgn
ff80: 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e  o = 0;.  pPg->pN
ff90: 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
ffa0: 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a  PrevHash = 0;.}.
ffb0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
ffc0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
ffd0: 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
ffe0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
fff0: 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
10000 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
10010 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
10020 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
10030 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
10040 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
10050 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
10060 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
10070 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
10080 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
10090 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
100a0 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
100b0 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
100c0 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
100d0 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
100e0 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
100f0 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
10100 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
10110 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
10120 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
10130 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
10140 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
10150 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
10160 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
10170 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
10180 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
10190 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
101a0 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
101b0 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
101c0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
101d0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
101e0 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
101f0 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
10200 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
10210 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
10220 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
10230 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
10240 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
10250 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
10260 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10270 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
10280 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
10290 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
102a0 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
102b0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
102c0 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
102d0 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
102e0 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
102f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69   table */.  unli
10300 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
10310 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66  er, pPg);.}..#if
10320 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10330 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
10340 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10350 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65  used to truncate
10360 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
10370 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a  tabase.  Delete.
10380 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f  ** all pages who
10390 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65  se pgno is large
103a0 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
103b0 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72  bSize and is unr
103c0 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65  eferenced..** Re
103d0 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c  ferenced pages l
103e0 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
103f0 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65  r->dbSize are ze
10400 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  roed..*/.static 
10410 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63  void memoryTrunc
10420 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
10430 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
10440 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67  ;.  PgHdr **ppPg
10450 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d  ;.  int dbSize =
10460 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
10470 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67  ..  ppPg = &pPag
10480 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c  er->pAll;.  whil
10490 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29  e( (pPg = *ppPg)
104a0 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
104b0 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65  Pg->pgno<=dbSize
104c0 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d   ){.      ppPg =
104d0 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
104e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
104f0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20  Pg->nRef>0 ){.  
10500 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
10510 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
10520 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
10530 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20  ze);.      ppPg 
10540 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
10550 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10560 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e     *ppPg = pPg->
10570 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
10580 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
10590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
105a0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50  e(pPg);.      pP
105b0 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20  ager->nPage--;. 
105c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
105d0 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54  .#define memoryT
105e0 72 75 6e 63 61 74 65 28 70 29 0a 23 65 6e 64 69  runcate(p).#endi
105f0 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  f../*.** Try to 
10600 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  obtain a lock on
10610 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65   a file.  Invoke
10620 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
10630 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a  ck if the lock.*
10640 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  * is currently n
10650 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52  ot available.  R
10660 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20  epeat until the 
10670 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
10680 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f  turns.** false o
10690 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b  r until the lock
106a0 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
106b0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
106c0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
106d0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
106e0 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
106f0 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a  in.** the lock..
10700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
10710 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
10720 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10730 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
10740 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
10750 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d  t( PAGER_SHARED=
10760 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
10770 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
10780 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56  RESERVED==RESERV
10790 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
107a0 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55  ert( PAGER_EXCLU
107b0 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f  SIVE==EXCLUSIVE_
107c0 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
107d0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
107e0 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
107f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
10800 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
10810 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10820 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
10830 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
10840 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
10850 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71  QLITE_BUSY && sq
10860 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
10870 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
10880 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a  BusyHandler) );.
10890 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
108a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
108b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c  Pager->state = l
108c0 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ocktype;.    }. 
108d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
108e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
108f0 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
10900 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
10910 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
10920 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
10930 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
10940 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
10950 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
10960 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70    sqlite3pager_p
10970 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
10980 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
10990 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
109a0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
109b0 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ode;.    return 
109c0 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  rc;.  }.  if( nP
109d0 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70  age>=(unsigned)p
109e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
109f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10a00 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
10a10 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
10a20 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
10a30 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Page;.    memory
10a40 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
10a50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10a60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
10a70 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
10a80 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
10a90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10aa0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10ab0 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65  }..  /* Get an e
10ac0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
10ad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
10ae0 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e  fore truncating.
10af0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
10b00 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
10b10 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
10b20 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
10b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10b40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10b50 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
10b60 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
10b70 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
10b80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10b90 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
10ba0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20  e = nPage;.  }. 
10bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10bc0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
10bd0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
10be0 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
10bf0 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
10c00 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
10c10 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
10c20 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
10c30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
10c40 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
10c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
10c60 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
10c70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
10c80 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
10c90 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
10ca0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
10cb0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
10cc0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
10cd0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
10ce0 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
10cf0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
10d00 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
10d10 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
10d20 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
10d30 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
10d40 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
10d50 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
10d60 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
10d70 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
10d80 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
10d90 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
10da0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
10db0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
10dc0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
10dd0 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
10de0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
10df0 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
10e00 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
10e10 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
10e20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
10e30 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
10e40 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
10e50 20 2a 70 4e 65 78 74 3b 0a 23 69 66 64 65 66 20   *pNext;.#ifdef 
10e60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
10e70 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
10e80 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
10e90 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73  cannot fail in s
10ea0 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
10eb0 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  () as one or mor
10ec0 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a  e calls to .  **
10ed0 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68   malloc() must h
10ee0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
10ef0 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74 68   made by this th
10f00 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20 67  read before it g
10f10 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ets.  ** to this
10f20 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61   point. This mea
10f30 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74  ns the ThreadDat
10f40 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  a must have been
10f50 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61   allocated alrea
10f60 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  dy.  ** so that 
10f70 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
10f80 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20 20  c can be set..  
10f90 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61 20  */.  ThreadData 
10fa0 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54  *pTsd = sqlite3T
10fb0 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61  hreadData();.  a
10fc0 73 73 65 72 74 28 20 70 50 61 67 65 72 20 29 3b  ssert( pPager );
10fd0 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20  .  assert( pTsd 
10fe0 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20  && pTsd->nAlloc 
10ff0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77 69  );.#endif..  swi
11000 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61  tch( pPager->sta
11010 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
11020 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a 0a 20  AGER_RESERVED:. 
11030 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 59     case PAGER_SY
11040 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73 65 20  NCED: .    case 
11050 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3a  PAGER_EXCLUSIVE:
11060 20 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 69   {.      /* We i
11070 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72 72  gnore any IO err
11080 6f 72 73 20 74 68 61 74 20 6f 63 63 75 72 20 64  ors that occur d
11090 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
110a0 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72  ck.      ** oper
110b0 61 74 69 6f 6e 2e 20 53 6f 20 64 69 73 61 62 6c  ation. So disabl
110c0 65 20 49 4f 20 65 72 72 6f 72 20 73 69 6d 75 6c  e IO error simul
110d0 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 65  ation so that te
110e0 73 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 77  sting.      ** w
110f0 6f 72 6b 73 20 6d 6f 72 65 20 65 61 73 69 6c 79  orks more easily
11100 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11110 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
11120 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
11130 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
11140 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
11150 65 72 29 3b 0a 20 20 20 20 20 20 65 6e 61 62 6c  er);.      enabl
11160 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
11170 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 20 20 69  rrors();.      i
11180 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
11190 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
111a0 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
111b0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
111c0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
111d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
111e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
111f0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
11200 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11210 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
11220 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  SHARED: {.      
11230 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
11240 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
11250 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
11260 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
11270 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
11280 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
11290 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
112a0 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
112b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
112c0 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50    }.  for(pPg=pP
112d0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
112e0 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66   pPg=pNext){.#if
112f0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
11300 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
11310 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
11320 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
11330 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
11340 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11350 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  !pPg->alwaysRoll
11360 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73  back );.      as
11370 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f  sert( !pHist->pO
11380 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rig );.      ass
11390 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74  ert( !pHist->pSt
113a0 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  mt );.    }.#end
113b0 69 66 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  if.    pNext = p
113c0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
113d0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
113e0 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28  );.  }.  TRACE2(
113f0 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
11400 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
11410 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11420 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50  ->errCode || (pP
11430 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
11440 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  n==0 && pPager->
11450 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a  stmtOpen==0) );.
11460 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
11470 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
11480 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11490 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
114a0 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
114b0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
114c0 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  al);.  if( pPage
114d0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
114e0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
114f0 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  e(&pPager->stfd)
11500 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
11510 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
11520 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66  fd);.  /* Temp f
11530 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  iles are automat
11540 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62  ically deleted b
11550 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66  y the OS.  ** if
11560 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
11570 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c  le ){.  **   sql
11580 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
11590 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
115a0 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69  .  ** }.  */..#i
115b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
115c0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
115d0 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  MENT.  /* Remove
115e0 20 74 68 65 20 70 61 67 65 72 20 66 72 6f 6d 20   the pager from 
115f0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
11600 6f 66 20 70 61 67 65 72 73 20 73 74 61 72 74 69  of pagers starti
11610 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54 68 72 65  ng at .  ** Thre
11620 61 64 44 61 74 61 2e 70 50 61 67 65 72 20 69 66  adData.pPager if
11630 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65   memory-manageme
11640 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  nt is enabled.. 
11650 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
11660 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72 20 29  ==pTsd->pPager )
11670 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50 61 67  {.    pTsd->pPag
11680 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65  er = pPager->pNe
11690 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
116a0 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20 20   Pager *pTmp;.  
116b0 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70 54 73    for(pTmp = pTs
116c0 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d 70 2d  d->pPager; pTmp-
116d0 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72 3b 20  >pNext!=pPager; 
116e0 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74  pTmp=pTmp->pNext
116f0 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70 4e  ){}.    pTmp->pN
11700 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e  ext = pPager->pN
11710 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ext;.  }.#endif.
11720 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
11730 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
11740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11750 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
11760 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
11770 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
11780 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
11790 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  te3pager_pagenum
117a0 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ber(void *pData)
117b0 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44  {.  PgHdr *p = D
117c0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
117d0 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ta);.  return p-
117e0 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pgno;.}../*.** 
117f0 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
11800 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
11810 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
11820 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
11830 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
11840 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
11850 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
11860 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
11870 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
11880 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
11890 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
118a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
118b0 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
118c0 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
118d0 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
118e0 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
118f0 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
11900 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
11910 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
11920 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
11930 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
11940 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
11950 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
11960 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
11970 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
11980 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
11990 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
119a0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
119b0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
119c0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
119d0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
119e0 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
119f0 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d     if( pPg==pPg-
11a00 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
11a10 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ynced ){.      P
11a20 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
11a30 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
11a40 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
11a50 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
11a60 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
11a70 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
11a80 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
11a90 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   p;.    }.    if
11aa0 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
11ab0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
11ac0 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
11ad0 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
11ae0 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
11af0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
11b00 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
11b10 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
11b20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
11b30 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
11b40 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
11b50 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
11b60 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
11b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11b80 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61  pPg->pPager->pLa
11b90 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
11ba0 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ree;.    }.    p
11bb0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66  Pg->pPager->nRef
11bc0 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e  ++;.  }.  pPg->n
11bd0 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref++;.  REFINFO
11be0 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20  (pPg);.}.#ifdef 
11bf0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
11c00 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
11c10 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
11c20 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
11c30 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
11c40 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
11c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11c60 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
11c70 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
11c80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
11c90 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
11ca0 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
11cb0 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
11cc0 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
11cd0 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
11ce0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
11cf0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
11d00 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
11d10 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
11d20 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
11d30 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
11d40 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
11d50 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69  te3pager_ref(voi
11d60 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
11d70 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
11d80 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
11d90 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
11da0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11db0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
11dc0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
11dd0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
11de0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
11df0 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
11e00 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
11e10 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
11e20 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
11e30 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
11e40 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
11e50 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
11e60 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
11e70 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
11e80 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
11e90 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
11ea0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
11eb0 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
11ec0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
11ed0 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
11ee0 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
11ef0 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
11f00 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
11f10 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
11f20 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
11f30 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
11f40 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
11f50 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
11f60 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
11f70 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
11f80 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
11f90 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
11fa0 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
11fb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
11fc0 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
11fd0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
11fe0 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
11ff0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
12000 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
12010 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
12020 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
12030 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
12040 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
12050 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
12060 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
12070 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
12080 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
12090 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
120a0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
120b0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
120c0 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
120d0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
120e0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
120f0 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
12100 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
12110 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
12120 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
12130 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
12140 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
12150 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12160 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
12170 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
12180 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
12190 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
121a0 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
121b0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
121c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
121d0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
121e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
121f0 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
12200 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
12210 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
12220 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
12230 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
12240 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
12250 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
12260 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
12270 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
12280 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
12290 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
122a0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
122b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
122c0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
122d0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
122e0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
122f0 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
12300 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
12310 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
12320 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
12330 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
12340 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
12350 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
12360 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
12370 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
12380 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
12390 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
123a0 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
123b0 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
123c0 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
123d0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
123e0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
123f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
12400 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
12410 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
12420 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12430 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
12440 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a  er->jfd, &jSz);.
12450 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
12460 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
12470 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12480 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12490 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20  f==jSz );.      
124a0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  }.#endif.      {
124b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
124c0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
124d0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
124e0 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
124f0 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
12500 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
12510 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
12520 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
12530 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
12540 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
12550 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
12560 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
12570 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
12580 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
12590 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
125a0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
125b0 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20  lback. .        
125c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
125d0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
125e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  ){.          TRA
125f0 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
12600 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
12610 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
12620 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12630 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
12640 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
12650 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
12660 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
12680 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
12690 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20  k(pPager->jfd,. 
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126b0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
126c0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
126d0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
126e0 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69  gic));.        i
126f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
12700 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
12710 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
12720 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
12730 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
12740 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12750 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  rc;..        rc 
12760 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
12770 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
12780 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
12790 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
127a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
127b0 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
127c0 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
127d0 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
127e0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
127f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12800 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
12810 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
12820 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  fsync);.      if
12830 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
12840 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
12850 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
12860 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
12870 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
12880 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
12890 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
128a0 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
128b0 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
128c0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
128d0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
128e0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
128f0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
12900 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
12910 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
12920 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
12930 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  er->pFirst;.  }.
12940 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
12950 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65    /* If the Page
12960 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
12970 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68  is clear then th
12980 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
12990 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20  .  ** flag must 
129a0 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f  also be clear fo
129b0 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65  r all pages.  Ve
129c0 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20  rify that this. 
129d0 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73   ** invariant is
129e0 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c   true..  */.  el
129f0 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  se{.    for(pPg=
12a00 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
12a10 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
12a20 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73  tAll){.      ass
12a30 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
12a40 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  nc==0 );.    }. 
12a50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12a60 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
12a70 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  =pPager->pFirst 
12a80 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
12a90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12aa0 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73  *.** Given a lis
12ab0 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e  t of pages (conn
12ac0 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48  ected by the PgH
12ad0 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
12ae0 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72  r) write.** ever
12af0 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  y one of those p
12b00 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20  ages out to the 
12b10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
12b20 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a  d mark them all.
12b30 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a  ** as clean..*/.
12b40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
12b50 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
12b60 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
12b70 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
12b80 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
12b90 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
12ba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12bb0 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
12bc0 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
12bd0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
12be0 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
12bf0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
12c00 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
12c10 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
12c20 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
12c30 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
12c40 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
12c50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
12c60 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
12c70 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
12c80 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
12c90 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
12ca0 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
12cb0 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
12cc0 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
12cd0 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
12ce0 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
12cf0 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
12d00 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
12d10 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
12d20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
12d30 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
12d40 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
12d50 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
12d60 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
12d70 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
12d80 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
12d90 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
12da0 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
12db0 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
12dc0 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
12dd0 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
12de0 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
12df0 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
12e00 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
12e10 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
12e20 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
12e30 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
12e40 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
12e50 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
12e60 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
12e70 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
12e80 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
12e90 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
12ea0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
12eb0 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
12ec0 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
12ed0 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
12ee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
12ef0 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
12f00 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
12f10 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
12f20 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
12f30 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
12f40 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
12f50 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
12f60 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
12f70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12f80 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
12f90 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c   rc;.  }..  whil
12fa0 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  e( pList ){.    
12fb0 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64  assert( pList->d
12fc0 69 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20 3d  irty );.    rc =
12fd0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
12fe0 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73  Pager->fd, (pLis
12ff0 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  t->pgno-1)*(i64)
13000 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
13010 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
13020 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f  return rc;.    /
13030 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
13040 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
13050 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
13060 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
13070 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
13080 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
13090 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
130a0 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
130b0 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
130c0 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
130d0 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
130e0 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
130f0 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
13100 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
13110 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
13120 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
13130 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13140 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61  pList->pgno<=pPa
13150 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
13160 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
13170 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
13180 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
13190 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
131a0 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54  gno, 6);.      T
131b0 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20  RACE3("STORE %d 
131c0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
131d0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
131e0 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  st->pgno);.     
131f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
13200 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
13210 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
13220 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
13230 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
13240 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
13250 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
13260 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
13270 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45   TRACE3("NOSTORE
13280 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
13290 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
132a0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
132b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
132c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
132d0 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64  rc;.    pList->d
132e0 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
132f0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
13300 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
13310 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
13320 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
13330 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
13340 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
13350 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
13360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13370 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72  .** Collect ever
13380 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74  y dirty page int
13390 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61  o a dirty list a
133a0 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70  nd.** return a p
133b0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
133c0 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e  ad of that list.
133d0 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a    All pages are.
133e0 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65  ** collected eve
133f0 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74  n if they are st
13400 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  ill in use..*/.s
13410 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
13420 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
13430 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50  _pages(Pager *pP
13440 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
13450 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69  p, *pList;.  pLi
13460 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  st = 0;.  for(p=
13470 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
13480 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
13490 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74  .    if( p->dirt
134a0 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44  y ){.      p->pD
134b0 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20  irty = pList;.  
134c0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20      pList = p;. 
134d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
134e0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
134f0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
13500 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
13510 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67  journal on the g
13520 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41  iven pager..** A
13530 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
13540 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  one that needs t
13550 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
13560 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
13570 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
13580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13590 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
135a0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
135b0 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
135c0 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
135d0 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
135e0 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
135f0 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
13600 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74  same name.  Just
13610 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
13620 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
13630 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
13640 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
13650 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
13660 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74  useJournal ) ret
13670 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
13680 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
13690 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
136a0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  al) ) return 0;.
136b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43    if( sqlite3OsC
136c0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
136d0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72  (pPager->fd) ) r
136e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73  eturn 0;.  if( s
136f0 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
13700 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30  count(pPager)==0
13710 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
13720 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
13730 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72  zJournal);.    r
13740 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
13750 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
13760 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
13770 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
13780 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
13790 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
137a0 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d. .**.** This r
137b0 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72  outine may retur
137c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  n SQLITE_IOERR, 
137d0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53  SQLITE_FULL or S
137e0 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a  QLITE_OK. It .**
137f0 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68   does not set th
13800 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  e pPager->errCod
13810 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
13820 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13830 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70  recycle(Pager *p
13840 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f  Pager, int syncO
13850 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29  k, PgHdr **ppPg)
13860 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
13870 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20    *ppPg = 0;..  
13880 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
13890 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
138a0 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
138b0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
138c0 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74   ** require us t
138d0 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  o do an fsync() 
138e0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  on the journal..
138f0 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61    */.  pPg = pPa
13900 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
13910 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  d;..  /* If we c
13920 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
13930 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
13940 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
13950 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68  ync().  ** on th
13960 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
13970 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
13980 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
13990 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79  s is a.  ** very
139a0 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
139b0 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
139c0 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
139d0 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a  ut sometimes.  *
139e0 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
139f0 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lped..  */.  if(
13a00 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65   pPg==0 && pPage
13a10 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e  r->pFirst && syn
13a20 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a  cOk && !MEMDB){.
13a30 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
13a40 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
13a50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
13a60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
13a70 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
13a80 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
13a90 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  nc ){.      /* I
13aa0 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
13ab0 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
13ac0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
13ad0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  into the.      *
13ae0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
13af0 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
13b00 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
13b10 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  ying a journal. 
13b20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74       ** header t
13b30 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
13b40 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
13b50 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
13b60 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  ve.      ** alre
13b70 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
13b80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13b90 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65   (in case the he
13ba0 61 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ader is.      **
13bb0 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
13bc0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
13bd0 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
13be0 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
13bf0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
13c00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13c10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
13c20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
13c30 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
13c40 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
13c50 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
13c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13c70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
13c80 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
13c90 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rst;.  }.  if( p
13ca0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Pg==0 ){.    ret
13cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13cc0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
13cd0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
13ce0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
13cf0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
13d00 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
13d10 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69   dirty..  */.  i
13d20 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
13d30 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
13d40 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
13d50 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
13d60 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
13d70 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
13d80 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
13d90 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28 20   pPg );.    if( 
13da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13db0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
13dc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
13dd0 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
13de0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ==0 );..  /* If 
13df0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
13e00 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72  recycling is mar
13e10 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c  ked as alwaysRol
13e20 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a  lback, then.  **
13e30 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20   set the global 
13e40 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
13e50 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c  lag, thus disabl
13e60 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  ing the.  ** sql
13e70 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ite_dont_rollbac
13e80 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
13e90 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
13ea0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
13eb0 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  n..  ** It is ne
13ec0 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68  cessary to do th
13ed0 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70  is because the p
13ee0 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  age marked alway
13ef0 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d  sRollback.  ** m
13f00 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64  ight be reloaded
13f10 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65   at a later time
13f20 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69   but at that poi
13f30 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65  nt we won't reme
13f40 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69  mber.  ** that i
13f50 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77  s was marked alw
13f60 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  aysRollback.  Th
13f70 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c  is means that al
13f80 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a  l pages must.  *
13f90 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
13fa0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
13fb0 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
13fc0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
13fd0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
13fe0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c  {.    pPager->al
13ff0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
14000 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
14010 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
14020 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
14030 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
14040 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c  table.  */.  unl
14050 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
14060 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
14070 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a 20 20 2a 70 70  ->nOvfl);..  *pp
14080 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  Pg = pPg;.  retu
14090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
140a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
140b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
140c0 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f  o free superfluo
140d0 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61  us dynamically a
140e0 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a  llocated memory.
140f0 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70  ** held by the p
14100 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d  ager system. Mem
14110 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e  ory in use by an
14120 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61  y SQLite pager a
14130 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74  llocated.** by t
14140 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
14150 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 46  d may be sqliteF
14160 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e  ree()ed..**.** n
14170 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Req is the numbe
14180 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  r of bytes of me
14190 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f  mory required. O
141a0 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68 61  nce this much ha
141b0 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73  s.** been releas
141c0 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
141d0 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67 61   returns. A nega
141e0 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20 6e  tive value for n
141f0 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72 65  Req means.** fre
14200 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
14210 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   as possible. Th
14220 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
14230 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
14240 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  er .** of bytes 
14250 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73  of memory releas
14260 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ed..*/.#ifdef SQ
14270 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
14280 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e  RY_MANAGEMENT.in
14290 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
142a0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 69 6e  elease_memory(in
142b0 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73 74  t nReq){.  const
142c0 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
142d0 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68 72  dro = sqlite3Thr
142e0 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79 28  eadDataReadOnly(
142f0 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a 20  );.  Pager *p;. 
14300 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d   int nReleased =
14310 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
14320 2f 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c  /* If the the gl
14330 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65  obal mutex is he
14340 6c 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74  ld, this subrout
14350 69 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20  ine becomes a.  
14360 2a 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79  ** o-op; zero by
14370 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72  tes of memory ar
14380 65 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69  e freed.  This i
14390 73 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73  s because.  ** s
143a0 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20  ome of the code 
143b0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20  invoked by this 
143c0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73  function may als
143d0 6f 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62  o.  ** try to ob
143e0 74 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20  tain the mutex, 
143f0 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64  resulting in a d
14400 65 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  eadlock..  */.  
14410 69 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d  if( sqlite3OsInM
14420 75 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72  utex(0) ){.    r
14430 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
14440 2f 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f  /* Outermost loo
14450 70 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f  p runs for at mo
14460 73 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e  st two iteration
14470 73 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69  s. First iterati
14480 6f 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74  on we.  ** try t
14490 6f 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68  o find memory th
144a0 61 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  at can be releas
144b0 65 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69  ed without calli
144c0 6e 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f  ng fsync(). Seco
144d0 6e 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f  nd.  ** iteratio
144e0 6e 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75  n (which only ru
144f0 6e 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ns if the first 
14500 66 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e  failed to free n
14510 52 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a  Req bytes of.  *
14520 2a 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72  * memory) is per
14530 6d 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66  mitted to call f
14540 73 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20  sync(). This is 
14550 6f 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d  of course much m
14560 6f 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73  ore .  ** expens
14570 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ive..  */.  for(
14580 69 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b  i=0; i<=1; i++){
14590 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  ..    /* Loop th
145a0 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51  rough all the SQ
145b0 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e  Lite pagers open
145c0 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
145d0 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20  t thread. */.   
145e0 20 66 6f 72 28 70 3d 70 54 73 64 72 6f 2d 3e 70   for(p=pTsdro->p
145f0 50 61 67 65 72 3b 20 70 20 26 26 20 28 6e 52 65  Pager; p && (nRe
14600 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64  q<0 || nReleased
14610 3c 6e 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e 65  <nReq); p=p->pNe
14620 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  xt){.      PgHdr
14630 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74   *pPg;.      int
14640 20 72 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46   rc;..      /* F
14650 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74  or each pager, t
14660 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61  ry to free as ma
14670 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73  ny pages as poss
14680 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20  ible (without . 
14690 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
146a0 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20  fsync() if this 
146b0 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65  is the first ite
146c0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75  ration of the ou
146d0 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a  termost .      *
146e0 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a  * loop)..      *
146f0 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53  /.      while( S
14700 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
14710 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 2c  pager_recycle(p,
14720 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70 50   i, &pPg)) && pP
14730 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g) {.        /* 
14740 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61  We've found a pa
14750 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74  ge to free. At t
14760 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
14770 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20  ge has been .   
14780 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20       ** removed 
14790 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61  from the page ha
147a0 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c  sh-table, free-l
147b0 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c  ist and synced-l
147c0 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ist .        ** 
147d0 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20  (pFirstSynced). 
147e0 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74  It is still in t
147f0 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41  he all pages (pA
14800 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ll) list. .     
14810 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20     ** Remove it 
14820 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62  from this list b
14830 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20  efore freeing.. 
14840 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
14850 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b    ** Todo: Check
14860 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74   the Pager.pStmt
14870 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   list to make su
14880 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49  re this is Ok. I
14890 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  t .        ** pr
148a0 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68  obably is though
148b0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
148c0 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70       PgHdr *pTmp
148d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
148e0 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ( pPg );.       
148f0 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
14900 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  m_stmt_list(pPg)
14910 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
14920 67 3d 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  g==p->pAll ){.  
14930 20 20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c 6c           p->pAll
14940 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
14950 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14960 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20  .          for( 
14970 70 54 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54  pTmp=p->pAll; pT
14980 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
14990 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
149a0 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
149b0 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
149c0 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
149d0 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  All;.        }. 
149e0 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64         nReleased
149f0 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53   += sqliteAllocS
14a00 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ize(pPg);.      
14a10 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
14a20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
14a30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
14a50 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * An error occur
14a60 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
14a70 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
14a80 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20  e file or .     
14a90 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e     ** journal in
14aa0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29   pager_recycle()
14ab0 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e  . The error is n
14ac0 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ot returned to t
14ad0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
14ae0 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
14af0 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
14b00 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
14b10 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
14b20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
14b30 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
14b40 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
14b50 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e  er (or users, in
14b60 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20   the case .     
14b70 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65     ** of a share
14b80 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f  d pager cache) o
14b90 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20  f the pager for 
14ba0 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20  which the error 
14bb0 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20  occured..       
14bc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14bd0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  rt( rc==SQLITE_I
14be0 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OERR || rc==SQLI
14bf0 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TE_FULL );.     
14c00 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74     assert( p->st
14c10 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
14c20 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70  VED );.        p
14c30 61 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63  ager_error(p, rc
14c40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14c50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
14c60 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64  Released;.}.#end
14c70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
14c80 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
14c90 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  EMENT */../*.** 
14ca0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
14cb0 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
14cc0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
14cd0 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
14ce0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
14cf0 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
14d00 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
14d10 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
14d20 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
14d30 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
14d40 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
14d50 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
14d60 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
14d70 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
14d80 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
14d90 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
14da0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
14db0 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
14dc0 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
14dd0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
14de0 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
14df0 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
14e00 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
14e10 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
14e20 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
14e30 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
14e40 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
14e50 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
14e60 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
14e70 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
14e80 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
14e90 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
14ea0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
14eb0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
14ec0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
14ed0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
14ee0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
14ef0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
14f00 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
14f10 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
14f20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
14f30 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
14f40 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
14f50 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
14f60 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
14f70 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
14f80 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
14f90 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
14fa0 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
14fb0 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
14fc0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
14fd0 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
14fe0 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
14ff0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
15000 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
15010 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
15020 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
15030 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
15040 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
15050 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
15060 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
15070 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
15080 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
15090 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
150a0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
150b0 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
150c0 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
150d0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
150e0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
150f0 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65  e3pager_get(Page
15100 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
15110 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50  pgno, void **ppP
15120 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
15130 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
15140 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
15150 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
15160 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
15170 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
15180 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
15190 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
151a0 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20  is, or zero, is 
151b0 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
151c0 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
151d0 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
151e0 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
151f0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
15200 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
15210 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
15220 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
15230 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
15240 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63  ve not hit any c
15250 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a  ritical errors..
15260 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20    */ .  assert( 
15270 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a  pPager!=0 );.  *
15280 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  ppPage = 0;.  if
15290 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
152a0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
152b0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
152c0 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
152d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
152e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
152f0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
15300 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
15310 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44  hen get a SHARED
15320 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68   lock.  ** on th
15330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15340 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
15350 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
15360 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66 28  MEMDB ){.    if(
15370 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
15380 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63  lock ){.      rc
15390 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
153a0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
153b0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
153c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
153d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
153e0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
153f0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
15400 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
15410 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
15420 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
15430 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
15440 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
15450 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
15460 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
15470 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
15480 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
15490 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
154a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48   */.    if( hasH
154b0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
154c0 29 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 20 47  ) ){.       /* G
154d0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
154e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
154f0 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
15500 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
15510 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
15520 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
15530 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
15540 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
15550 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
15560 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
15570 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
15580 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
15590 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
155a0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
155b0 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
155c0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
155d0 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
155e0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a  hat the.       *
155f0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
15600 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
15610 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
15620 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69   still rolling i
15630 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63  t .       ** bac
15640 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  k..       ** .  
15650 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
15660 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
15670 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
15680 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
15690 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73   the.       ** s
156a0 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69  econd process wi
156b0 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70  ll get to this p
156c0 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
156d0 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20   and fail to.   
156e0 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
156f0 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  's own EXCLUSIVE
15700 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15710 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
15720 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
15730 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
15740 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
15750 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
15760 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15780 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
15790 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
157a0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
157b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
157c0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
157d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
157e0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
157f0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d  r, rc);.       }
15800 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
15810 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
15820 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20  CLUSIVE;..      
15830 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
15840 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67  rnal for reading
15850 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53   only.  Return S
15860 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20  QLITE_BUSY if.  
15870 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
15880 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
15890 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
158a0 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  .       **.     
158b0 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    ** The journal
158c0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e   file does not n
158d0 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
158e0 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20   itself.  The.  
158f0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
15900 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70  file is never op
15910 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61  en unless the ma
15920 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
15930 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a   holds.       **
15940 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
15950 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
15960 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
15970 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
15980 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f    ** processes o
15990 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
159a0 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  al at the same t
159b0 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ime..       */. 
159c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
159d0 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
159e0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
159f0 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  l, &pPager->jfd)
15a00 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
15a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
15a30 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
15a40 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
15a50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
15a60 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
15a70 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  CK;.         ret
15a80 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
15a90 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
15aa0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15ab0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
15ac0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15ad0 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
15ae0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
15af0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
15b00 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
15b10 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
15b20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15b30 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  Hdr = 0;..      
15b40 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
15b50 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
15b60 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
15b70 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
15b80 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
15b90 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
15ba0 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
15bb0 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
15bc0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
15bd0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69  Pager);.       i
15be0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74   ){.         ret
15c00 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
15c10 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
15c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15c30 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  pPg = 0;.  }else
15c40 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
15c50 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68  for page in cach
15c60 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
15c70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
15c80 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  er, pgno);.    i
15c90 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67  f( MEMDB && pPag
15ca0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
15cb0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
15cc0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
15cd0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
15ce0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
15cf0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
15d00 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
15d10 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
15d20 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
15d30 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54      int h;.    T
15d40 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
15d50 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28  >nMiss);.    if(
15d60 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
15d70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
15d80 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
15d90 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20  =0 || MEMDB ){. 
15da0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
15db0 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20   new page */.   
15dc0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d     pPg = sqliteM
15dd0 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
15de0 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
15df0 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  >pageSize.      
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
15e20 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
15e30 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
15e60 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
15e70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
15e80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
15e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15ea0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
15eb0 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20   memset(pPg, 0, 
15ec0 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20  sizeof(*pPg));. 
15ed0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
15ee0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
15ef0 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
15f00 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
15f10 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
15f20 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
15f30 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
15f40 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50  pPager;.      pP
15f50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
15f60 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
15f70 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
15f80 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67   pPg;.      pPag
15f90 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  er->nPage++;.   
15fa0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
15fb0 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61  Page>pPager->nMa
15fc0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
15fd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15fe0 3e 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67  >nMaxPage==(pPag
15ff0 65 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a  er->nPage-1) );.
16000 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
16010 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20  nMaxPage++;.    
16020 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
16030 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
16040 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20  recycle(pPager, 
16050 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  1, &pPg);.      
16060 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
16080 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
16090 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 67        assert(pPg
160a0 29 20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ) ;.    }.    pP
160b0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
160c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
160d0 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  aInJournal && (i
160e0 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
160f0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
16100 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
16110 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  kMemory(pPager->
16120 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  aInJournal, pgno
16130 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  /8);.      asser
16140 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
16150 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
16160 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
16170 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   (pPager->aInJou
16180 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  rnal[pgno/8] & (
16190 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
161a0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
161b0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
161c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
161d0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
161e0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
161f0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
16200 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
16210 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  InStmt && (int)p
16220 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
16230 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  tSize.          
16240 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61     && (pPager->a
16250 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26  InStmt[pgno/8] &
16260 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
16270 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  =0 ){.      page
16280 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
16290 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  t(pPg);.    }els
162a0 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65  e{.      page_re
162b0 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
162c0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
162d0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
162e0 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65   0;.    pPg->nRe
162f0 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e  f = 1;.    REFIN
16300 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20 70 50  FO(pPg);..    pP
16310 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
16320 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45    if( pPager->nE
16330 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20  xtra>0 ){.      
16340 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
16350 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
16360 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  r), 0, pPager->n
16370 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
16380 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
16390 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73  rCode ){.      s
163a0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
163b0 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  f(PGHDR_TO_DATA(
163c0 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20  pPg));.      rc 
163d0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
163e0 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
163f0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
16400 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
16410 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65  age with data, e
16420 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67  ither by reading
16430 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
16440 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20  se.    ** file, 
16450 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  or by setting th
16460 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f  e entire page to
16470 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
16480 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67    if( sqlite3pag
16490 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
164a0 67 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20 7c  ger)<(int)pgno |
164b0 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  | MEMDB ){.     
164c0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
164d0 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
164e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
164f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16500 20 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42     assert( MEMDB
16510 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
16520 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
16530 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
16540 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
16550 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
16560 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16580 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
16590 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  ad(pPager->fd, P
165a0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
165b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
165e0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
165f0 20 20 54 52 41 43 45 33 28 22 46 45 54 43 48 20    TRACE3("FETCH 
16600 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
16610 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
16620 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
16630 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
16640 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
16650 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
16660 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  3);.      if( rc
16670 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16680 20 20 20 20 20 20 20 69 36 34 20 66 69 6c 65 53         i64 fileS
16690 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ize;.        int
166a0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 4f 73   rc2 = sqlite3Os
166b0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
166c0 3e 66 64 2c 20 26 66 69 6c 65 53 69 7a 65 29 3b  >fd, &fileSize);
166d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
166e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66  !=SQLITE_OK || f
166f0 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50  ileSize>=pgno*pP
16700 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
16710 7b 0a 09 20 20 2f 2a 20 41 6e 20 49 4f 20 65 72  {..  /* An IO er
16720 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 6f  ror occured in o
16730 6e 65 20 6f 66 20 74 68 65 20 74 68 65 20 73 71  ne of the the sq
16740 6c 69 74 65 33 4f 73 53 65 65 6b 28 29 20 6f 72  lite3OsSeek() or
16750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 71  .          ** sq
16760 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63 61  lite3OsRead() ca
16770 6c 6c 73 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  lls above. */.  
16780 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e          pPg->pgn
16790 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  o = 0;.         
167a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
167b0 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
167c0 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20  A(pPg));.       
167d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
167e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
167f0 20 20 20 20 20 20 20 63 6c 65 61 72 5f 73 69 6d         clear_sim
16800 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28  ulated_io_error(
16810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
16820 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
16830 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
16840 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
16850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16860 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53  lse{.        TES
16870 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
16880 52 65 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Read);.      }. 
16890 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e     }..    /* Lin
168a0 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  k the page into 
168b0 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61  the page hash ta
168c0 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70  ble */.    h = p
168d0 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b  ager_hash(pgno);
168e0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
168f0 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
16900 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67  ash[h];.    pPag
16910 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
16920 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
16930 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
16940 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
16950 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
16960 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
16970 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
16980 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
16990 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  g;.    }..#ifdef
169a0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
169b0 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
169c0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
169d0 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
169e0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
169f0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
16a00 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65  d page is in the
16a10 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
16a20 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50      TEST_INCR(pP
16a30 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
16a40 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
16a50 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20    }.  *ppPage = 
16a60 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
16a70 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
16a80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16a90 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
16aa0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
16ab0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
16ac0 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
16ad0 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
16ae0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
16af0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
16b00 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
16b10 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
16b20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
16b30 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
16b40 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
16b50 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
16b60 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
16b70 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
16b80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
16b90 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
16ba0 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
16bb0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
16bc0 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
16bd0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16be0 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
16bf0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
16c00 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
16c10 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
16c20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
16c30 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
16c40 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
16c50 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f   happened..*/.vo
16c60 69 64 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  id *sqlite3pager
16c70 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
16c80 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
16c90 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
16ca0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
16cb0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
16cc0 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
16cd0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
16ce0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
16cf0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
16d00 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
16d10 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d  n 0;.  }.  pPg =
16d20 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
16d30 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
16d40 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75  f( pPg==0 ) retu
16d50 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66  rn 0;.  page_ref
16d60 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
16d70 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
16d80 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  g);.}../*.** Rel
16d90 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
16da0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
16db0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
16dc0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
16dd0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
16de0 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
16df0 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
16e00 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
16e10 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
16e20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
16e30 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
16e40 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
16e50 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
16e60 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
16e70 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
16e80 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76  te3pager_unref(v
16e90 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
16ea0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a  gHdr *pPg;..  /*
16eb0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
16ec0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
16ed0 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
16ee0 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54  /.  pPg = DATA_T
16ef0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
16f00 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
16f10 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e  Ref>0 );.  pPg->
16f20 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46  nRef--;.  REFINF
16f30 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b  O(pPg);..  CHECK
16f40 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
16f50 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
16f60 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
16f70 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
16f80 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
16f90 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
16fa0 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
16fb0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
16fc0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
16fd0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ef==0 ){.    Pag
16fe0 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
16ff0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
17000 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
17010 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20  NextFree = 0;.  
17020 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
17030 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74   = pPager->pLast
17040 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
17050 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  ast = pPg;.    i
17060 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
17070 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
17080 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
17090 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Free = pPg;.    
170a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
170b0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
170c0 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
170d0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
170e0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69  0 && pPager->pFi
170f0 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a  rstSynced==0 ){.
17100 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
17110 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67  irstSynced = pPg
17120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17130 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
17140 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  tor ){.      pPa
17150 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
17160 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  (pData, pPager->
17170 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
17180 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  .  .    /* When 
17190 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20  all pages reach 
171a0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72  the freelist, dr
171b0 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  op the read lock
171c0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
171d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
171e0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
171f0 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61  r->nRef--;.    a
17200 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
17210 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Ref>=0 );.    if
17220 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
17230 30 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20  0 && !MEMDB ){. 
17240 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
17250 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
17260 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
17270 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
17280 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
17290 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
172a0 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
172b0 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
172c0 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
172d0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
172e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
172f0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
17300 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
17310 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
17320 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
17330 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
17340 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
17350 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
17360 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
17370 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
17380 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
17390 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
173a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
173b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
173c0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
173d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
173e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
173f0 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65  SERVED );.  asse
17400 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
17410 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
17420 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17430 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
17440 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17450 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  aInJournal==0 );
17460 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
17470 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
17480 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
17490 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
174a0 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
174b0 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
174c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
174d0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
174e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
174f0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66  OMEM;.    goto f
17500 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
17510 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20  urnal;.  }.  rc 
17520 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
17530 78 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d  xclusive(pPager-
17540 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67  >zJournal, &pPag
17550 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20  er->jfd,.       
17560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17570 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
17580 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70  ->tempFile);.  p
17590 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
175a0 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
175b0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
175c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
175d0 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  lHdr = 0;.  if( 
175e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
175f0 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
17600 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
17610 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
17620 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61  sSetFullSync(pPa
17630 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
17640 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
17650 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c   sqlite3OsSetFul
17660 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  lSync(pPager->fd
17670 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
17680 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  sync);.  sqlite3
17690 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
176a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
176b0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29  ger->zDirectory)
176c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
176d0 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70  nalOpen = 1;.  p
176e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
176f0 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  arted = 0;.  pPa
17700 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
17710 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  0;.  pPager->alw
17720 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
17730 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
17740 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
17750 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
17760 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
17770 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f  rrCode;.    goto
17780 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
17790 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70  journal;.  }.  p
177a0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
177b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
177c0 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  ze;..  rc = writ
177d0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
177e0 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  er);..  if( pPag
177f0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
17800 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
17810 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
17820 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
17830 62 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20  begin(pPager);. 
17840 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
17850 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
17860 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
17870 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
17880 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
17890 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
178a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
178b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
178c0 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
178d0 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65  eturn rc;..faile
178e0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
178f0 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  l:.  sqliteFree(
17900 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
17910 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  al);.  pPager->a
17920 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
17930 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17940 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  NOMEM ){.    /* 
17950 49 66 20 74 68 69 73 20 77 61 73 20 61 20 6d 61  If this was a ma
17960 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20  lloc() failure, 
17970 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 6f 74  then we will not
17980 20 62 65 20 63 6c 6f 73 69 6e 67 20 74 68 65 20   be closing the 
17990 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c  pager.    ** fil
179a0 65 2e 20 53 6f 20 64 65 6c 65 74 65 20 61 6e 79  e. So delete any
179b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 65   journal file we
179c0 20 6d 61 79 20 68 61 76 65 20 6a 75 73 74 20 63   may have just c
179d0 72 65 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73  reated. Otherwis
179e0 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 79  e,.    ** the sy
179f0 73 74 65 6d 20 77 69 6c 6c 20 67 65 74 20 63 6f  stem will get co
17a00 6e 66 75 73 65 64 2c 20 77 65 20 68 61 76 65 20  nfused, we have 
17a10 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74  a read-lock on t
17a20 68 65 20 66 69 6c 65 20 61 6e 64 20 61 0a 20 20  he file and a.  
17a30 20 20 2a 2a 20 6d 79 73 74 65 72 69 6f 75 73 20    ** mysterious 
17a40 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 70 70 65  journal has appe
17a50 61 72 65 64 20 69 6e 20 74 68 65 20 66 69 6c 65  ared in the file
17a60 73 79 73 74 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20  system..    */. 
17a70 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
17a80 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
17a90 6e 61 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nal);.  }else{. 
17aa0 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
17ab0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
17ac0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  O_LOCK);.    pPa
17ad0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
17ae0 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  ER_UNLOCK;.  }. 
17af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17b00 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
17b10 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
17b20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
17b30 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
17b40 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
17b50 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
17b60 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
17b70 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
17b80 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c  _commit() is cal
17b90 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
17ba0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
17bb0 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
17bc0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
17bd0 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20  ager_close() is 
17be0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
17bf0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
17c00 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
17c10 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
17c20 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
17c30 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
17c40 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
17c50 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
17c60 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
17c70 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
17c80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
17c90 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
17ca0 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
17cb0 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
17cc0 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
17cd0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
17ce0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
17cf0 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
17d00 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
17d10 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
17d20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
17d30 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
17d40 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
17d50 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
17d60 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
17d70 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
17d80 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
17d90 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
17da0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
17db0 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
17dc0 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
17dd0 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
17de0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
17df0 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
17e00 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
17e10 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
17e20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
17e30 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
17e40 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
17e50 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
17e60 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
17e70 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
17e80 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
17e90 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
17ea0 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
17eb0 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
17ec0 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
17ed0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
17ee0 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
17ef0 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
17f00 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
17f10 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
17f20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
17f30 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
17f40 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
17f50 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
17f60 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
17f70 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
17f80 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
17f90 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
17fa0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
17fb0 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28  ite3pager_begin(
17fc0 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
17fd0 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 67 48 64   exFlag){.  PgHd
17fe0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
17ff0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
18000 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
18010 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
18020 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18030 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
18040 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61  g->nRef>0 );.  a
18050 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
18060 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
18070 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  CK );.  if( pPag
18080 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
18090 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
180a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
180b0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
180c0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
180d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
180e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
180f0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50  LUSIVE;.      pP
18100 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
18110 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
18120 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
18130 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18140 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
18150 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
18160 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
18170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18180 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
18190 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
181a0 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  RVED;.        if
181b0 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
181c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
181d0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
181e0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
181f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  LOCK);.        }
18200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18210 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18220 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
18230 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
18240 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
18250 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
18260 20 20 20 54 52 41 43 45 32 28 22 54 52 41 4e 53     TRACE2("TRANS
18270 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
18280 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
18290 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
182a0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
182b0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
182c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
182d0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
182e0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
182f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18300 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18310 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
18320 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
18330 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
18340 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
18350 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
18360 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
18370 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
18380 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
18390 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
183a0 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
183b0 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
183c0 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
183d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
183e0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
183f0 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
18400 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
18410 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52  acquires a RESER
18420 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
18430 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
18440 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  e RESERVED.** lo
18450 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
18460 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72  acquired, this r
18470 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
18480 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65  QLITE_BUSY.  The
18490 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
184a0 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66  ine must check f
184b0 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76  or that return v
184c0 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65  alue and be care
184d0 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68  ful not to.** ch
184e0 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
184f0 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f  ta until this ro
18500 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
18510 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
18520 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
18530 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
18540 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20  written because 
18550 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c  the disk is full
18560 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
18570 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
18580 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64  QLITE_FULL and d
18590 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  oes an immediate
185a0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c   rollback..** Al
185b0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69  l subsequent wri
185c0 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f  te attempts also
185d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
185e0 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a  ULL until there.
185f0 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20  ** is a call to 
18600 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
18610 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33  mit() or sqlite3
18620 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
18630 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
18640 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
18650 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44  r_write(void *pD
18660 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
18670 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
18680 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
18690 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
186a0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
186b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
186c0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
186d0 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
186e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
186f0 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  e ){ .    return
18700 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
18720 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
18730 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18740 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61  E_PERM;.  }..  a
18750 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
18760 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
18770 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
18780 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
18790 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
187a0 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
187b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
187c0 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
187d0 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
187e0 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
187f0 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70  t away..  */.  p
18800 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
18810 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
18820 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53  nal && (pPg->inS
18830 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  tmt || pPager->s
18840 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a  tmtInUse==0) ){.
18850 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
18860 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65  yCache = 1;.  }e
18870 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
18880 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
18890 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
188a0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
188b0 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
188c0 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
188d0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
188e0 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
188f0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
18900 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
18910 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
18920 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
18930 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
18940 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
18950 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
18960 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
18970 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
18980 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
18990 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
189a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
189b0 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28  ite3pager_begin(
189c0 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 69  pData, 0);.    i
189d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
189e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
189f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
18a00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
18a10 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
18a20 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
18a30 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
18a40 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
18a50 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
18a60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
18a70 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
18a80 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
18a90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
18aa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18ab0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18ac0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18ad0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  || !pPager->useJ
18ae0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
18af0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
18b00 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
18b10 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
18b20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
18b30 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
18b40 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
18b50 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
18b60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
18b70 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
18b80 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
18b90 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
18ba0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
18bb0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
18bc0 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
18bd0 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
18be0 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
18bf0 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72  urnal && (pPager
18c00 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ->useJournal || 
18c10 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20  MEMDB) ){.      
18c20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
18c30 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
18c40 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
18c50 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20      int szPg;.  
18c60 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
18c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
18c80 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
18c90 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
18ca0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
18cb0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f        TRACE3("JO
18cc0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
18cd0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
18ce0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
18cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
18d00 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  rt( pHist->pOrig
18d10 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
18d20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
18d30 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
18d40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18d50 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  e );.          i
18d60 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
18d70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
18d80 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72  emcpy(pHist->pOr
18d90 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  ig, PGHDR_TO_DAT
18da0 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
18db0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
18dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
18dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18de0 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64  u32 cksum, saved
18df0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
18e00 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b   *pData2, *pEnd;
18e10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
18e20 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
18e30 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
18e40 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
18e50 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
18e60 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
18e70 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
18e80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
18e90 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
18ea0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
18eb0 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
18ec0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
18ed0 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
18ee0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
18ef0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ) );.          p
18f00 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
18f10 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
18f20 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
18f30 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
18f40 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
18f50 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
18f60 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e 64 20  .          pEnd 
18f70 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61 67 65  = pData2 + pPage
18f80 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
18f90 20 20 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d         pData2 -=
18fa0 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61   4;.          sa
18fb0 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e  ved = *(u32*)pEn
18fc0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  d;.          put
18fd0 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73  32bits(pEnd, cks
18fe0 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  um);.          s
18ff0 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  zPg = pPager->pa
19000 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20  geSize+8;.      
19010 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44      put32bits(pD
19020 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ata2, pPg->pgno)
19030 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
19040 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
19050 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
19060 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20  ta2, szPg);.    
19070 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
19080 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67  urnalOff += szPg
19090 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
190a0 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E4("JOURNAL %d p
190b0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
190c0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
190d0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
190e0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
190f0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
19100 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  nc);.          *
19110 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76  (u32*)pEnd = sav
19120 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72  ed;...  /* An er
19130 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
19140 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
19150 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
19160 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
19170 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
19180 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
19190 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
191a0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
191b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
191c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
191d0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
191e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
191f0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  }..          pPa
19200 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
19210 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19220 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
19230 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
19240 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
19250 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
19260 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
19270 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
19280 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
19290 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
192a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
192b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
192c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
192d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
192e0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
192f0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
19300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
19310 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
19320 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20  list(pPg);.     
19330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
19340 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19350 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
19360 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
19370 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
19380 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
19390 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 34  ;.        TRACE4
193a0 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
193b0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
193c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
193d0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
193e0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
193f0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
19400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19410 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
19420 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
19430 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
19440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
19450 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
19460 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  1;.    }.  .    
19470 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
19480 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
19490 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
194a0 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
194b0 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
194c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
194d0 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
194e0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
194f0 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
19500 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
19510 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
19520 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
19530 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
19540 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
19550 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
19560 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
19570 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
19580 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
19590 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70  >stmtInUse && !p
195a0 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69  Pg->inStmt && (i
195b0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
195c0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
195d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
195e0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
195f0 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
19600 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
19610 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
19620 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
19630 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
19640 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
19650 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
19660 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19670 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30   pHist->pStmt==0
19680 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   );.        pHis
19690 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  t->pStmt = sqlit
196a0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
196b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
196c0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
196d0 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
196e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
196f0 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
19700 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
19710 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
19720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19730 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
19740 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
19750 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19760 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
19770 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  no);.      }else
19780 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
19790 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
197a0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
197b0 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a  Pg->pgno, 7)-4;.
197c0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
197d0 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
197e0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  gno);.        rc
197f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
19800 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
19810 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
19820 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20  pageSize+4);.   
19830 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d       TRACE3("STM
19840 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
19850 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
19860 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
19870 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
19880 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
198a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
198b0 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
198c0 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
198d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
198e0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
198f0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
19900 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
19910 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
19920 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
19930 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65      }.      page
19940 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
19950 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
19960 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
19970 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
19980 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
19990 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
199a0 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
199b0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
199c0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
199d0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28  g->pgno;.    if(
199e0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
199f0 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49  r->dbSize==PENDI
19a00 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
19a10 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
19a20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
19a30 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
19a40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19a50 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
19a60 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
19a70 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
19a80 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
19a90 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
19aa0 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
19ab0 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
19ac0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
19ad0 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
19ae0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
19af0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
19b00 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
19b10 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
19b20 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c  pager_iswriteabl
19b30 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  e(void *pData){.
19b40 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
19b50 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
19b60 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ta);.  return pP
19b70 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64  g->dirty;.}.#end
19b80 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
19b90 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
19ba0 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
19bb0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69   content of a si
19bc0 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74  ngle page with t
19bd0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
19be0 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61  n the third.** a
19bf0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
19c00 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65  sqlite3pager_ove
19c10 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
19c20 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
19c30 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
19c40 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
19c50 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
19c60 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
19c70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
19c80 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
19c90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19ca0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
19cb0 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
19cc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
19cd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19ce0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20    memcpy(pPage, 
19cf0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
19d00 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
19d10 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
19d20 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
19d30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19d40 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
19d50 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
19d60 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
19d70 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
19d80 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
19d90 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
19da0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
19db0 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20  age "pgno" back 
19dc0 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
19dd0 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
19de0 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
19df0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
19e00 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
19e10 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
19e20 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
19e30 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
19e40 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
19e50 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
19e60 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
19e70 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
19e80 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
19e90 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
19ea0 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
19eb0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
19ec0 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
19ed0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
19ee0 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
19ef0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70   the.** sqlite3p
19f00 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
19f10 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
19f20 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
19f30 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
19f40 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
19f50 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
19f60 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
19f70 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
19f80 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
19f90 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
19fa0 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
19fb0 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
19fc0 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
19fd0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
19fe0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
19ff0 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
1a000 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
1a010 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
1a020 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
1a030 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
1a040 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
1a050 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
1a060 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
1a070 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1a080 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
1a090 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
1a0a0 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
1a0b0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
1a0c0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
1a0d0 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
1a0e0 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
1a0f0 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
1a100 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
1a110 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
1a120 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
1a130 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1a140 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
1a150 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
1a160 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
1a170 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
1a180 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
1a190 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
1a1a0 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  se the page cont
1a1b0 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c  ains.** critical
1a1c0 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
1a1d0 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
1a1e0 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62  it gets rolled b
1a1f0 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20  ack in spite.** 
1a200 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  of the dont_roll
1a210 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
1a220 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
1a230 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67  r_dont_write(Pag
1a240 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1a250 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
1a260 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  *pPg;..  if( MEM
1a270 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  DB ) return;..  
1a280 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
1a290 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
1a2a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
1a2b0 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 6e 65 76  =0 );  /* We nev
1a2c0 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f 77 72  er call _dont_wr
1a2d0 69 74 65 20 75 6e 6c 65 73 73 20 74 68 65 20 70  ite unless the p
1a2e0 61 67 65 20 69 73 20 69 6e 20 6d 65 6d 20 2a 2f  age is in mem */
1a2f0 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  .  pPg->alwaysRo
1a300 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66  llback = 1;.  if
1a310 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20  ( pPg->dirty && 
1a320 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
1a330 73 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  se ){.    if( pP
1a340 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
1a350 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
1a360 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1a370 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
1a380 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
1a390 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
1a3a0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1a3b0 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
1a3c0 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
1a3d0 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
1a3e0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1a3f0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
1a400 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
1a410 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
1a420 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
1a430 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
1a440 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
1a450 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
1a460 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
1a470 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
1a480 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
1a490 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
1a4a0 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
1a4b0 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
1a4c0 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
1a4d0 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
1a4e0 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
1a4f0 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
1a500 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
1a510 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
1a520 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
1a530 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
1a540 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
1a550 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
1a560 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
1a570 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1a580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a590 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49  TRACE3("DONT_WRI
1a5a0 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
1a5b0 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52  \n", pgno, PAGER
1a5c0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1a5d0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1a5e0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
1a5f0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
1a600 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1a610 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1a620 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1a630 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1a640 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1a650 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1a660 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
1a670 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1a680 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
1a690 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
1a6a0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
1a6b0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1a6c0 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
1a6d0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1a6e0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
1a6f0 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
1a700 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
1a710 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a720 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
1a730 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
1a740 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74  lback(void *pDat
1a750 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
1a760 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1a770 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
1a780 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1a790 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70  pPager;..  if( p
1a7a0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1a7b0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c  GER_EXCLUSIVE ||
1a7c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a7d0 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  Open==0 ) return
1a7e0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  ;.  if( pPg->alw
1a7f0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70  aysRollback || p
1a800 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1a810 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29  lback || MEMDB )
1a820 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
1a830 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
1a840 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
1a850 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
1a860 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  DbSize ){.    as
1a870 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1a880 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
1a890 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
1a8a0 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
1a8b0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1a8c0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d  gno&7);.    pPg-
1a8d0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1a8e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a8f0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1a900 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1a910 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1a920 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1a930 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f  &7);.      page_
1a940 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1a950 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
1a960 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f   TRACE3("DONT_RO
1a970 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
1a980 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
1a990 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1a9a0 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  er));.  }.  if( 
1a9b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1a9c0 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d  e && !pPg->inStm
1a9d0 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  t && (int)pPg->p
1a9e0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
1a9f0 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  tSize ){.    ass
1aa00 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
1aa10 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
1aa20 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
1aa30 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
1aa40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1aa50 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
1aa60 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1aa70 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1aa80 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1aa90 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64  7);.    page_add
1aaa0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
1aab0 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  g);.  }.}.../*.*
1aac0 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
1aad0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1aae0 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
1aaf0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
1ab00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
1ab10 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
1ab20 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
1ab30 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
1ab40 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
1ab50 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1ab60 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
1ab70 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
1ab80 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
1ab90 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
1aba0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
1abb0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
1abc0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1abd0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
1abe0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1abf0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
1ac00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ac10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1ac20 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
1ac30 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
1ac40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1ac50 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  ROR;.  }.  TRACE
1ac60 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
1ac70 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1ac80 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1ac90 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
1aca0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1acb0 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
1acc0 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
1acd0 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
1ace0 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
1acf0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
1ad00 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
1ad10 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
1ad20 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1ad30 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
1ad40 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1ad50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
1ad60 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1ad70 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
1ad80 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
1ad90 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69    pPg = pPg->pDi
1ada0 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  rty;.    }.#ifnd
1adb0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f  ef NDEBUG.    fo
1adc0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
1add0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
1ade0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
1adf0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1ae00 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1ae10 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1ae20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ae30 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  !pPg->alwaysRoll
1ae40 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73  back );.      as
1ae50 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f  sert( !pHist->pO
1ae60 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rig );.      ass
1ae70 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74  ert( !pHist->pSt
1ae80 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  mt );.    }.#end
1ae90 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  if.    pPager->p
1aea0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
1aeb0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1aec0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
1aed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1aee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1aef0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
1af00 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74  0 ){.    /* Exit
1af10 20 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20   early (without 
1af20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63  doing the time-c
1af30 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33  onsuming sqlite3
1af40 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a  OsSync() calls).
1af50 20 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20      ** if there 
1af60 68 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61  have been no cha
1af70 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1af80 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1af90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1afa0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
1afb0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1afc0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
1afd0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1afe0 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
1aff0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1b000 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1b010 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1b020 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1b030 70 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65  pager_sync(pPage
1b040 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  r, 0, 0);.  if( 
1b050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b060 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1b070 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
1b080 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1b090 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
1b0a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b0b0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1b0c0 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
1b0d0 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
1b0e0 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
1b0f0 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
1b100 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
1b110 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
1b120 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
1b130 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
1b140 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
1b150 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
1b160 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1b170 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
1b180 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
1b190 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
1b1a0 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
1b1b0 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
1b1c0 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50  otocol (SQLITE_P
1b1d0 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65  ROTOCOL) or unle
1b1e0 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
1b1f0 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
1b200 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
1b210 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b220 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
1b230 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
1b240 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
1b250 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
1b260 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
1b270 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
1b280 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
1b290 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
1b2a0 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
1b2b0 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
1b2c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1b2d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1b2e0 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  r_rollback(Pager
1b2f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1b300 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52   rc;.  TRACE2("R
1b310 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
1b320 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1b330 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1b340 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1b350 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
1b360 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  pAll; p; p=p->pN
1b370 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
1b380 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b  gHistory *pHist;
1b390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1b3a0 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  p->alwaysRollbac
1b3b0 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  k );.      if( !
1b3c0 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  p->dirty ){.    
1b3d0 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
1b3e0 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
1b3f0 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
1b400 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  er))->pOrig );. 
1b410 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1b420 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
1b430 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1b440 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29  Pager))->pStmt )
1b450 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
1b460 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ue;.      }..   
1b470 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52     pHist = PGHDR
1b480 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
1b490 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
1b4a0 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
1b4b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
1b4c0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
1b4d0 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50  pHist->pOrig, pP
1b4e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1b4f0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
1b500 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25  "ROLLBACK-PAGE %
1b510 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  d of %d\n", p->p
1b520 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1b530 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ger));.      }el
1b540 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43  se{.        TRAC
1b550 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63  E3("PAGE %d is c
1b560 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70  lean on %d\n", p
1b570 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1b580 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1b590 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  }.      clearHis
1b5a0 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
1b5b0 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
1b5c0 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72  .      p->inJour
1b5d0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
1b5e0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1b5f0 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74      p->pPrevStmt
1b600 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20   = p->pNextStmt 
1b610 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
1b620 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1b630 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
1b640 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50  ger->xReiniter(P
1b650 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
1b660 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1b670 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1b680 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61    .    }.    pPa
1b690 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
1b6a0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1b6b0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  ze = pPager->ori
1b6c0 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d  gDbSize;.    mem
1b6d0 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
1b6e0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1b6f0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
1b700 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1b710 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
1b720 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1b730 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
1b740 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
1b750 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
1b760 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1b770 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1b780 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
1b790 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
1b7a0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
1b7b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b7c0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
1b7d0 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
1b7e0 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
1b7f0 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
1b800 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1b810 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
1b820 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  VE ){.      page
1b830 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
1b840 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  r);.    }.    re
1b850 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1b860 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
1b870 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1b880 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
1b890 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
1b8a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c    rc = pager_rel
1b8b0 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
1b8c0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
1b8d0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1b8e0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1b8f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b900 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
1b910 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1b920 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1b930 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
1b940 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
1b950 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f  bSize = -1;..  /
1b960 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1b970 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
1b980 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
1b990 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
1b9a0 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61  he pager.  ** ca
1b9b0 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67  che. So call pag
1b9c0 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68  er_error() on th
1b9d0 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b  e way out to mak
1b9e0 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a  e any error .  *
1b9f0 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  * persistent..  
1ba00 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  */.  return page
1ba10 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1ba20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc);.}../*.** Re
1ba30 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1ba40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1ba50 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
1ba60 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
1ba70 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
1ba80 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
1ba90 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
1baa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1bab0 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  r_isreadonly(Pag
1bac0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1bad0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
1bae0 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
1baf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1bb00 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
1bb10 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
1bb20 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
1bb30 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28  ite3pager_stats(
1bb40 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1bb50 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
1bb60 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61  1];.  a[0] = pPa
1bb70 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31  ger->nRef;.  a[1
1bb80 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ] = pPager->nPag
1bb90 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67  e;.  a[2] = pPag
1bba0 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b  er->mxPage;.  a[
1bbb0 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
1bbc0 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50  ize;.  a[4] = pP
1bbd0 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
1bbe0 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
1bbf0 72 43 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  rCode;.#ifdef SQ
1bc00 4c 49 54 45 5f 54 45 53 54 0a 20 20 61 5b 36 5d  LITE_TEST.  a[6]
1bc10 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
1bc20 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
1bc30 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
1bc40 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b  = pPager->nOvfl;
1bc50 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
1bc60 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
1bc70 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
1bc80 65 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  e;.#endif.  retu
1bc90 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn a;.}../*.** S
1bca0 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
1bcb0 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e   rollback point.
1bcc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1bcd0 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
1bce0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
1bcf0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1bd00 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
1bd10 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d  n.  A new statem
1bd20 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  ent journal is c
1bd30 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
1bd40 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
1bd50 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
1bd60 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
1bd70 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
1bd80 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
1bd90 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1bda0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
1bdb0 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
1bdc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
1bdd0 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
1bde0 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
1bdf0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1be00 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
1be10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1be20 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a  r->dbSize>=0 );.
1be30 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42    TRACE2("STMT-B
1be40 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  EGIN %d\n", PAGE
1be50 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1be60 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1be70 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1be80 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
1be90 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
1bea0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1beb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bec0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
1bed0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1bee0 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
1bef0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1bf00 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1bf10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1bf20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1bf30 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1bf40 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1bf50 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
1bf60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1bf70 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
1bf80 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d  pPager->aInStmt=
1bf90 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c  =0 ){.    /* sql
1bfa0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
1bfb0 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
1bfc0 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
1bfd0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1bfe0 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
1bff0 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BUG.  rc = sqlit
1c000 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1c010 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
1c020 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
1c030 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1c040 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
1c050 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1c060 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d  er->stmtJSize ==
1c070 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c080 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Off );.#endif.  
1c090 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
1c0a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  e = pPager->jour
1c0b0 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
1c0c0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
1c0d0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70  ger->dbSize;.  p
1c0e0 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
1c0f0 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
1c100 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61  >stmtCksum = pPa
1c110 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
1c120 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
1c130 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  tmtOpen ){.    r
1c140 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1c150 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
1c160 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b   &pPager->stfd);
1c170 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
1c180 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
1c190 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72  iled;.    pPager
1c1a0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a  ->stmtOpen = 1;.
1c1b0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1c1c0 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NRec = 0;.  }.  
1c1d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1c1e0 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
1c1f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d  SQLITE_OK;. .stm
1c200 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
1c210 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
1c220 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  nStmt ){.    sql
1c230 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
1c240 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  aInStmt);.    pP
1c250 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
1c260 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1c270 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
1c280 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  mit a statement.
1c290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1c2a0 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
1c2b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1c2c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1c2d0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1c2e0 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
1c2f0 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22  xt;.    TRACE2("
1c300 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e  STMT-COMMIT %d\n
1c310 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1c320 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  r));.    if( !ME
1c330 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MDB ){.      sql
1c340 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
1c350 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
1c360 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
1c370 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
1c380 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20  stfd, 0); */.   
1c390 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
1c3a0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
1c3b0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1c3c0 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  aInStmt = 0;.   
1c3d0 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70   }.    for(pPg=p
1c3e0 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
1c3f0 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
1c400 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67       pNext = pPg
1c410 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20  ->pNextStmt;.   
1c420 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1c430 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  inStmt );.      
1c440 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pPg->inStmt = 0;
1c450 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1c460 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  vStmt = pPg->pNe
1c470 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
1c480 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1c490 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
1c4a0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1c4b0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1c4c0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ger);.        sq
1c4d0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
1c4e0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
1c4f0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
1c500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c510 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1c520 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  NRec = 0;.    pP
1c530 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1c540 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1c550 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pStmt = 0;.  }.
1c560 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
1c570 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
1c580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c590 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1c5a0 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  k a statement..*
1c5b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1c5c0 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b  er_stmt_rollback
1c5d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1c5e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1c5f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1c600 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32  se ){.    TRACE2
1c610 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
1c620 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1c630 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
1c640 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1c650 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
1c660 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
1c670 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
1c680 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  g=pPg->pNextStmt
1c690 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
1c6a0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
1c6b0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
1c6c0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1c6d0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
1c6e0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
1c6f0 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
1c700 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74  DATA(pPg), pHist
1c710 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d  ->pStmt, pPager-
1c720 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1c730 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1c740 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
1c750 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
1c760 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1c770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1c780 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1c790 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
1c7a0 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d  tSize;.      mem
1c7b0 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
1c7c0 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
1c7d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c7e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1c7f0 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
1c800 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1c810 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70    }.    sqlite3p
1c820 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
1c830 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
1c840 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
1c850 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
1c860 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1c870 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
1c880 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1c890 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
1c8a0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  hname of the dat
1c8b0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
1c8c0 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1c8d0 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65  e3pager_filename
1c8e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1c8f0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1c900 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ->zFilename;.}..
1c910 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1c920 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
1c930 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c940 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1c950 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72  sqlite3pager_dir
1c960 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
1c970 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1c980 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
1c990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1c9a0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
1c9b0 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
1c9c0 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
1c9d0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
1c9e0 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65  ager_journalname
1c9f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1ca00 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1ca10 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
1ca20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1ca30 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
1ca40 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
1ca50 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
1ca60 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
1ca70 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
1ca80 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
1ca90 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1caa0 33 70 61 67 65 72 5f 6e 6f 73 79 6e 63 28 50 61  3pager_nosync(Pa
1cab0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1cac0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
1cad0 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  oSync;.}../*.** 
1cae0 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
1caf0 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
1cb00 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
1cb10 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50  r_set_codec(.  P
1cb20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
1cb30 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
1cb40 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
1cb50 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
1cb60 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
1cb70 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
1cb80 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
1cb90 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
1cba0 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  decArg;.}../*.**
1cbb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1cbc0 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
1cbd0 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  ment the databas
1cbe0 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
1cbf0 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64  unter,.** stored
1cc00 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74   at byte 24 of t
1cc10 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
1cc20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1cc30 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1cc40 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
1cc50 67 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50  ger){.  void *pP
1cc60 61 67 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  age;.  PgHdr *pP
1cc70 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e  gHdr;.  u32 chan
1cc80 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e  ge_counter;.  in
1cc90 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  t rc;..  /* Open
1cca0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
1ccb0 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
1ccc0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1ccd0 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
1cce0 65 72 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a  er, 1, &pPage);.
1ccf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cd00 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1cd10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
1cd20 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1cd30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1cd40 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1cd50 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  rc;..  /* Read t
1cd60 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
1cd70 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   at byte 24. */.
1cd80 20 20 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f    pPgHdr = DATA_
1cd90 54 4f 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b  TO_PGHDR(pPage);
1cda0 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  .  change_counte
1cdb0 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69  r = retrieve32bi
1cdc0 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a  ts(pPgHdr, 24);.
1cdd0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
1cde0 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
1cdf0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
1ce00 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
1ce10 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f  . */.  change_co
1ce20 75 6e 74 65 72 2b 2b 3b 0a 20 20 70 75 74 33 32  unter++;.  put32
1ce30 62 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48  bits(((char*)PGH
1ce40 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64  DR_TO_DATA(pPgHd
1ce50 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  r))+24, change_c
1ce60 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 52  ounter);..  /* R
1ce70 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
1ce80 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
1ce90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
1cea0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ef(pPage);.  ret
1ceb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1cec0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1ced0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1cee0 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
1cef0 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
1cf00 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
1cf10 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
1cf20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1cf30 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1cf40 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
1cf50 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
1cf60 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
1cf70 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
1cf80 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
1cf90 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
1cfa0 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
1cfb0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1cfc0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1cfd0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
1cfe0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
1cff0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
1d000 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
1d010 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
1d020 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d030 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
1d040 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
1d050 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
1d060 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
1d070 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
1d080 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
1d090 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1d0a0 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
1d0b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1d0c0 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
1d0d0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1d0e0 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
1d0f0 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
1d100 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
1d110 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
1d120 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
1d130 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20  te3pager_sync() 
1d140 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  call..**.** If p
1d150 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20  arameter nTrunc 
1d160 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
1d170 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
1d180 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
1d190 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73  .** nTrunc pages
1d1a0 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62   (this is used b
1d1b0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1d1c0 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74  tabases)..*/.int
1d1d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1d1e0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
1d1f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1d200 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75  aster, Pgno nTru
1d210 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
1d220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52  SQLITE_OK;..  TR
1d230 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
1d240 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
1d250 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
1d260 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
1d270 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1d280 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
1d290 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1d2a0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1d2b0 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
1d2c0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1d2d0 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
1d2e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
1d2f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1d300 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
1d310 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1d320 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1d330 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d  GER_SYNCED && !M
1d340 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1d350 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20  dirtyCache ){.  
1d360 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1d370 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d380 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1d390 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61  ..    /* If a ma
1d3a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1d3b0 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
1d3c0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1d3d0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  to the.    ** jo
1d3e0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
1d3f0 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75   no sync is requ
1d400 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65  ired. This happe
1d410 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20  ns when it is.  
1d420 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68    ** written, th
1d430 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66  en the process f
1d440 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20  ails to upgrade 
1d450 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
1d460 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  to an.    ** EXC
1d470 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
1d480 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70   next time the p
1d490 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20  rocess tries to 
1d4a0 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a  commit the.    *
1d4b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
1d4c0 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20  e m-j name will 
1d4d0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1d4e0 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  n written..    *
1d4f0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
1d500 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a  r->setMaster ){.
1d510 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1d520 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1d530 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
1d540 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d550 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1d560 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53  _exit;.#ifndef S
1d570 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1d580 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
1d590 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1d5a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1d5b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1d5c0 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
1d5d0 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
1d5e0 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
1d5f0 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
1d600 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
1d610 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
1d620 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1d630 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1d640 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
1d650 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1d660 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a  ;.        void *
1d670 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  pPage;.        i
1d680 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
1d690 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1d6a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
1d6b0 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50  =nTrunc+1; i<=pP
1d6c0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1d6d0 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
1d6e0 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d     if( !(pPager-
1d6f0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d  >aInJournal[i/8]
1d700 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26   & (1<<(i&7))) &
1d710 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
1d720 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1d730 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1d740 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67  pPager, i, &pPag
1d750 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1d760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d770 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1d780 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1d790 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1d7a0 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d7c0 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
1d7d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1d7e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d7f0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1d800 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1d810 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20   }.        } .  
1d820 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1d830 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
1d840 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1d850 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1d860 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d870 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1d880 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20  _exit;.      rc 
1d890 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1d8a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1d8b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d8c0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1d8d0 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
1d8e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1d8f0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e  VACUUM.    if( n
1d900 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1d910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1d920 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1d930 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
1d940 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d950 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1d960 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
1d970 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
1d980 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
1d990 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1d9a0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
1d9b0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
1d9c0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
1d9d0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
1d9e0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1d9f0 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
1da00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1da10 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1da20 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63  it;..    /* Sync
1da30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1da40 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
1da50 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
1da60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1da70 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1da80 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  r->fd, 0);.    }
1da90 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
1daa0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
1dab0 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
1dac0 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
1dad0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
1dae0 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
1daf0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
1db00 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  unc);.  }..sync_
1db10 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
1db20 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1db30 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1db40 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
1db50 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
1db60 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20  ied by pData to 
1db70 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
1db80 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
1db90 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
1dba0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
1dbb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1dbc0 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65  e pgno. If curre
1dbd0 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20  nt page.** pgno 
1dbe0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
1dbf0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
1dc00 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
1dc10 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20  t written there 
1dc20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f  by.** by this ro
1dc30 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20  utine. The same 
1dc40 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70  applies to the p
1dc50 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73  age pData refers
1dc60 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a   to on entry to.
1dc70 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1dc80 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
1dc90 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65  s to the page re
1dca0 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74  fered to by pDat
1dcb0 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  a remain valid. 
1dcc0 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
1dcd0 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
1dce0 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1dcf0 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20  Data (i.e. data 
1dd00 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
1dd10 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
1dd20 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
1dd30 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
1dd40 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1dd50 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1dd60 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
1dd70 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
1dd80 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
1dd90 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1dda0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
1ddb0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
1ddc0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
1ddd0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
1dde0 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
1ddf0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
1de00 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
1de10 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
1de20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
1de30 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
1de40 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
1de50 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
1de60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1de70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61  ager_movepage(Pa
1de80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
1de90 64 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70  d *pData, Pgno p
1dea0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1deb0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1dec0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48  DR(pData);.  PgH
1ded0 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69  dr *pPgOld; .  i
1dee0 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
1def0 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
1df00 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1df10 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43  Ref>0 );..  TRAC
1df20 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
1df30 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
1df40 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
1df50 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
1df60 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1df70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1df80 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66  nc, pgno);..  if
1df90 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
1dfa0 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
1dfb0 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1dfc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1dfd0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1dfe0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1dff0 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
1e000 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1e010 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
1e020 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
1e030 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61  om it's hash-cha
1e040 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
1e050 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1e060 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1e070 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
1e080 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
1e090 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
1e0a0 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
1e0b0 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
1e0c0 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
1e0d0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
1e0e0 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
1e0f0 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
1e100 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
1e110 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
1e120 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
1e130 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
1e140 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
1e150 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20  ..  */.  pPgOld 
1e160 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1e170 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1e180 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
1e190 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1e1a0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
1e1b0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
1e1c0 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
1e1d0 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69  ;.    pPgOld->di
1e1e0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1e1f0 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
1e200 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1e210 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75  t( pPgOld->inJou
1e220 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50  rnal );.      pP
1e230 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1e240 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1e250 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1e260 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1e270 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
1e280 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61   }.  }..  /* Cha
1e290 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
1e2a0 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
1e2b0 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
1e2c0 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
1e2d0 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e  n. */.  pPg->pgn
1e2e0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
1e2f0 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
1e300 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1e310 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
1e320 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e330 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1e340 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ash==0 );.    pP
1e350 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1e360 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1e370 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
1e380 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
1e390 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67  aHash[h];.  pPag
1e3a0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1e3b0 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76  Pg;.  pPg->pPrev
1e3c0 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67  Hash = 0;..  pPg
1e3d0 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70  ->dirty = 1;.  p
1e3e0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1e3f0 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  e = 1;..  if( ne
1e400 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
1e410 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
1e420 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
1e430 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1e440 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
1e450 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
1e460 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
1e470 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
1e480 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
1e490 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
1e4a0 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
1e4b0 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
1e4c0 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
1e4d0 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
1e4e0 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  the .    ** Page
1e4f0 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.aInJournal bit
1e500 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
1e510 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
1e520 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64  remedied by load
1e530 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ing.    ** the p
1e540 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
1e550 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
1e560 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1e570 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20  eedSync flag..  
1e580 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1e590 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1e5a0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
1e5b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
1e5c0 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
1e5d0 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
1e5e0 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1e5f0 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
1e600 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
1e610 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65  ;.    void *pNee
1e620 64 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72  dSync;.    asser
1e630 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1e640 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
1e650 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1e660 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
1e670 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e  cPgno, &pNeedSyn
1e680 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
1e690 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1e6a0 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
1e6b0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1e6c0 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1e6d0 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e  DR(pNeedSync)->n
1e6e0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1e6f0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1e700 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75  NeedSync)->inJou
1e710 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41  rnal = 1;.    DA
1e720 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
1e730 64 53 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20  dSync)->dirty = 
1e740 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  1;.    sqlite3pa
1e750 67 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53  ger_unref(pNeedS
1e760 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ync);.  }..  ret
1e770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e780 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1e790 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1e7a0 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1e7b0 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1e7c0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
1e7d0 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1e7e0 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
1e7f0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
1e800 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
1e810 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
1e820 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
1e830 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
1e840 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
1e850 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
1e860 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
1e870 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
1e880 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
1e890 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
1e8a0 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
1e8b0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a  (pPager->fd);.}.
1e8c0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1e8d0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1e8e0 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
1e8f0 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
1e900 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
1e910 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
1e920 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1e930 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65  ger_refdump(Page
1e940 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
1e950 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28  Hdr *pPg;.  for(
1e960 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
1e970 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
1e980 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
1e990 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20  f( pPg->nRef<=0 
1e9a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e9b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
1e9c0 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64  tf("PAGE %3d add
1e9d0 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c  r=%p nRef=%d\n",
1e9e0 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67   .       pPg->pg
1e9f0 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  no, PGHDR_TO_DAT
1ea00 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65  A(pPg), pPg->nRe
1ea10 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
1ea20 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
1ea30 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
1ea40 2f 0a                                            /.