/ Hex Artifact Content
Login

Artifact 0f966f7fa225c377da2021fbbfdd50a48d877000:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 32 37  : pager.c,v 1.27
0350: 33 20 32 30 30 36 2f 30 39 2f 31 35 20 31 32 3a  3 2006/09/15 12:
0360: 32 39 3a 31 36 20 64 72 68 20 45 78 70 20 24 0a  29:16 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28  .#define TRACE1(
0440: 58 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  X)       sqlite3
0450: 44 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23  DebugPrintf(X).#
0460: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0470: 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  Y)     sqlite3De
0480: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23  bugPrintf(X,Y).#
0490: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
04a0: 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65  Y,Z)   sqlite3De
04b0: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29  bugPrintf(X,Y,Z)
04c0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
04d0: 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33  X,Y,Z,W) sqlite3
04e0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04f0: 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Z,W).#define TRA
0500: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0530: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
0540: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
0550: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0560: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c  define TRACE4(X,
0580: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0590: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
05a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
05b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
05c0: 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 64   macros are used
05d0: 20 77 69 74 68 69 6e 20 74 68 65 20 54 52 41 43   within the TRAC
05e0: 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76  EX() macros abov
05f0: 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75  e.** to print ou
0600: 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  t file-descripto
0610: 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52  rs. .**.** PAGER
0620: 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69  ID() takes a poi
0630: 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
0640: 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20 61  struct as it's a
0650: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0660: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0670: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0680: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
0690: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
06a0: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
06b0: 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e   as it's argumen
06c0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  t..*/.#define PA
06d0: 47 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28  GERID(p) ((int)(
06e0: 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20  p->fd)).#define 
06f0: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29  FILEHANDLEID(fd)
0700: 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a   ((int)fd)../*.*
0710: 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65  * The page cache
0720: 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61   as a whole is a
0730: 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20  lways in one of 
0740: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
0750: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
0760: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
0770: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0780: 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  che is not curre
0790: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
07a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
07b0: 20 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e            writin
07c0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
07d0: 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ile.  There is n
07e0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
07f0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
0800: 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  held in memory. 
0810: 20 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69   This is the ini
0820: 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  tial.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
0840: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ate..**.**   PAG
0850: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20  ER_SHARED       
0860: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0870: 69 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64  is reading the d
0880: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08a0: 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74    Writing is not
08b0: 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65   permitted.  The
08c0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20  re can be.**    
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08e0: 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64     multiple read
08f0: 65 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68  ers accessing th
0900: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a  e same database.
0910: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0920: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74           file at
0930: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
0940: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45  **.**   PAGER_RE
0950: 53 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73  SERVED      This
0960: 20 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73   process has res
0970: 65 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61  erved the databa
0980: 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  se for writing.*
0990: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
09a0: 20 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20          but has 
09b0: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79  not yet made any
09c0: 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20   changes.  Only 
09d0: 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20  one process.**  
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09f0: 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63       at a time c
0a00: 61 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64  an reserve the d
0a10: 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72  atabase.  The or
0a20: 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  iginal.**       
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
0a50: 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66  s not been modif
0a60: 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20  ied so other.** 
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a80: 20 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20        processes 
0a90: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
0aa0: 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b  ding the on-disk
0ab0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0ac0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0ad0: 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  se file..**.**  
0ae0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
0af0: 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61       The page ca
0b00: 63 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74  che is writing t
0b10: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b30: 20 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20        Access is 
0b40: 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f  exclusive.  No o
0b50: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f  ther processes o
0b60: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0b70: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61             threa
0b80: 64 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ds can be readin
0b90: 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69  g or writing whi
0ba0: 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20  le one.**       
0bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bc0: 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
0bd0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  ng..**.**   PAGE
0be0: 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20  R_SYNCED        
0bf0: 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  The pager moves 
0c00: 74 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72  to this state fr
0c10: 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  om PAGER_EXCLUSI
0c20: 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  VE.**           
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65              afte
0c40: 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
0c50: 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
0c60: 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ten to the.**   
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0c90: 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
0ca0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
0cb0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
0cc0: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e             disk.
0cd0: 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e   All that remain
0ce0: 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65  s to do is to re
0cf0: 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  move the.**     
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61    journal file a
0d20: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
0d30: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20  on will be.**   
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a      committed..*
0d60: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61  *.** The page ca
0d70: 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20  che comes up in 
0d80: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d90: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a  he first time a.
0da0: 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
0db0: 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68  get() occurs, th
0dc0: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0dd0: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ons to PAGER_SHA
0de0: 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c  RED..** After al
0df0: 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  l pages have bee
0e00: 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  n released using
0e10: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72   sqlite_page_unr
0e20: 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61  ef(),.** the sta
0e30: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  te transitions b
0e40: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c  ack to PAGER_UNL
0e50: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0e60: 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c  time.** that sql
0e70: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
0e80: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0e90: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0ea0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0eb0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0ec0: 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65  that sqlite_page
0ed0: 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  _write() can onl
0ee0: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0ef0: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0f00: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0f10: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0f20: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0f30: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0f40: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0f50: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0f60: 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61  VED.).** The tra
0f70: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0f80: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0f90: 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e  s when before an
0fa0: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
0fb0: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
0fc0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74  abase file.  Aft
0fd0: 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67  er an sqlite3pag
0fe0: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  er_rollback().**
0ff0: 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72   or sqlite_pager
1000: 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73  _commit(), the s
1010: 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74  tate goes back t
1020: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
1030: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1040: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1050: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1060: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1070: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1080: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1090: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
10a0: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
10b0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
10c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
10d0: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
10e0: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10f0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
1100: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
1110: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49        5../*.** I
1120: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  f the SQLITE_BUS
1130: 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  Y_RESERVED_LOCK 
1140: 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20  macro is set to 
1150: 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d  true at compile-
1160: 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61  time,.** then fa
1170: 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f  iled attempts to
1180: 20 67 65 74 20 61 20 72 65 73 65 72 76 65 64 20   get a reserved 
1190: 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65  lock will invoke
11a0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
11b0: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f  ck..** This is o
11c0: 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ff by default.  
11d0: 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73  To see why, cons
11e0: 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
11f0: 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20  ng scenario:.** 
1200: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65  .** Suppose thre
1210: 61 64 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  ad A already has
1220: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
1230: 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73 65 72  nd wants a reser
1240: 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72  ved lock..** Thr
1250: 65 61 64 20 42 20 61 6c 72 65 61 64 79 20 68 61  ead B already ha
1260: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
1270: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65  k and wants an e
1280: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
1290: 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61  If.** both threa
12a0: 64 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65  ds are using the
12b0: 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ir busy callback
12c0: 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  s, it might be a
12d0: 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65   long time.** be
12e0: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
12f0: 74 68 72 65 61 64 73 20 67 69 76 65 20 75 70 20  threads give up 
1300: 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f  and allows the o
1310: 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e  ther to proceed.
1320: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
1330: 68 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20  hread trying to 
1340: 67 65 74 20 74 68 65 20 72 65 73 65 72 76 65 64  get the reserved
1350: 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71   lock gives up q
1360: 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74  uickly.** (if it
1370: 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69   never invokes i
1380: 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  ts busy callback
1390: 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  ) then the conte
13a0: 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a  ntion will be.**
13b0: 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c   resolved quickl
13c0: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
13d0: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
13e0: 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65  ED_LOCK.# define
13f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1400: 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e  ERVED_LOCK 0.#en
1410: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1420: 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c  macro rounds val
1430: 75 65 73 20 75 70 20 73 6f 20 74 68 61 74 20 69  ues up so that i
1440: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1450: 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20  n address it.** 
1460: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1470: 20 62 65 20 61 6e 20 61 64 64 72 65 73 73 20 74   be an address t
1480: 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74  hat is aligned t
1490: 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e  o an 8-byte boun
14a0: 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  dary..*/.#define
14b0: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
14c0: 28 58 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e  (X)   (((X)+7)&~
14d0: 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69  7)../*.** Each i
14e0: 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  n-memory image o
14f0: 66 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20  f a page begins 
1500: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
1510: 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68  ng header..** Th
1520: 69 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c  is header is onl
1530: 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69  y visible to thi
1540: 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20  s pager module. 
1550: 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63   The client.** c
1560: 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70  ode that calls p
1570: 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74  ager sees only t
1580: 68 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  he data that fol
1590: 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e  lows the header.
15a0: 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f  .**.** Client co
15b0: 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73  de should call s
15c0: 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
15d0: 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72  e() on a page pr
15e0: 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a  ior to making.**
15f0: 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f   any modificatio
1600: 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e  ns to that page.
1610: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
1620: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1630: 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c  ite().** is call
1640: 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ed, the original
1650: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
1660: 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1670: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
1680: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  journal and PgHd
1690: 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  r.inJournal and 
16a0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61  PgHdr.needSync a
16b0: 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20  re set.  Later, 
16c0: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  once.** the jour
16d0: 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64  nal page has mad
16e0: 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69  e it onto the di
16f0: 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64  sk surface, PgHd
1700: 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73  r.needSync.** is
1710: 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d   cleared.  The m
1720: 6f 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e  odified page can
1730: 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1740: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ack into the ori
1750: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1760: 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
1770: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68   journal pages h
1780: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
1790: 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a  o disk and the.*
17a0: 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  * PgHdr.needSync
17b0: 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
17c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48  d..**.** The PgH
17d0: 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73  dr.dirty flag is
17e0: 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65   set when sqlite
17f0: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69  3pager_write() i
1800: 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  s called and.** 
1810: 69 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e  is cleared again
1820: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63   when the page c
1830: 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65  ontent is writte
1840: 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72  n back to the or
1850: 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  iginal.** databa
1860: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65  se file..*/.type
1870: 64 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72  def struct PgHdr
1880: 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50   PgHdr;.struct P
1890: 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a  gHdr {.  Pager *
18a0: 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20  pPager;         
18b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
18c0: 61 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68  ager to which th
18d0: 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20  is page belongs 
18e0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
1910: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
1920: 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  page */.  PgHdr 
1930: 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72  *pNextHash, *pPr
1940: 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68  evHash;  /* Hash
1950: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
1960: 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20   for PgHdr.pgno 
1970: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
1980: 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65  tFree, *pPrevFre
1990: 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20  e;  /* Freelist 
19a0: 6f 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  of pages where n
19b0: 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64  Ref==0 */.  PgHd
19c0: 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20  r *pNextAll;    
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19e0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
19f0: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
1a00: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
1a10: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
1a20: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
1a30: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1a40: 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61  */.  u8 inJourna
1a50: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1a60: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68      /* TRUE if h
1a70: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
1a80: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
1a90: 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20  u8 inStmt;      
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ab0: 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65  * TRUE if in the
1ac0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
1ad0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
1ae0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
1af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
1b00: 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  E if we need to 
1b10: 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67  write back chang
1b20: 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  es */.  u8 needS
1b30: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
1b40: 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a         /* Sync j
1b50: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72  ournal before wr
1b60: 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  iting this page 
1b70: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
1b80: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
1b90: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64      /* Disable d
1ba0: 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
1bb0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
1bc0: 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66    short int nRef
1bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
1bf0: 65 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  ers of this page
1c00: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
1c10: 72 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79  rty, *pPrevDirty
1c20: 3b 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61  ;    /* Dirty pa
1c30: 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 6f 74  ges */.  u32 not
1c40: 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
1c50: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1c60: 72 20 73 70 61 63 65 20 2a 2f 0a 23 69 66 64 65  r space */.#ifde
1c70: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1c80: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
1c90: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ash;.#endif.  /*
1ca0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1cb0: 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  e bytes of page 
1cc0: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
1cd0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
1ce0: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
1cf0: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
1d00: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
1d10: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
1d20: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
1d30: 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73  ory only databas
1d40: 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e  e, some extra in
1d50: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63  formation is rec
1d60: 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65  orded about.** e
1d70: 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74  ach page so that
1d80: 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20   changes can be 
1d90: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a  rolled back.  (J
1da0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
1db0: 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72   not.** used for
1dc0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1dd0: 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c  ases.)  The foll
1de0: 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  owing informatio
1df0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  n is added to.**
1e00: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
1e10: 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f  y EXTRA block fo
1e20: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
1e30: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bases..**.** Thi
1e40: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f  s information co
1e50: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64  uld have been ad
1e60: 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ded directly to 
1e70: 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74  the PgHdr struct
1e80: 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e  ure..** But then
1e90: 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75   it would take u
1ea0: 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74  p an extra 8 byt
1eb0: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e  es of storage on
1ec0: 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20   every PgHdr.** 
1ed0: 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61  even for disk-ba
1ee0: 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  sed databases.  
1ef0: 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74  Splitting it out
1f00: 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20   saves 8 bytes. 
1f10: 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
1f20: 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e   a savings of 0.
1f30: 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72  8% but those per
1f40: 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e  centages add up.
1f50: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1f60: 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48  ct PgHistory PgH
1f70: 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50  istory;.struct P
1f80: 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20  gHistory {.  u8 
1f90: 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f  *pOrig;     /* O
1fa0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78  riginal page tex
1fb0: 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74  t.  Restore to t
1fc0: 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f  his on a full ro
1fd0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a  llback */.  u8 *
1fe0: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65  pStmt;     /* Te
1ff0: 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20  xt as it was at 
2000: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
2010: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
2020: 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  tement */.};../*
2030: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
2040: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
2050: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
2060: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
2070: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2080: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
2090: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  C1(P,D,N,X) if( 
20a0: 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20  P->xCodec!=0 ){ 
20b0: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
20c0: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d  decArg,D,N,X); }
20d0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20e0: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
20f0: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f  *)(P->xCodec!=0?
2100: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
2110: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29  decArg,D,N,X):D)
2120: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
2130: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
2140: 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64   /* NO-OP */.# d
2150: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
2160: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29  ,N,X) ((char*)D)
2170: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
2180: 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72  onvert a pointer
2190: 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f   to a PgHdr into
21a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
21b0: 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61  s data.** and ba
21c0: 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65  ck again..*/.#de
21d0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41  fine PGHDR_TO_DA
21e0: 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28  TA(P)  ((void*)(
21f0: 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e  &(P)[1])).#defin
2200: 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  e DATA_TO_PGHDR(
2210: 44 29 20 20 28 26 28 28 50 67 48 64 72 2a 29 28  D)  (&((PgHdr*)(
2220: 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65  D))[-1]).#define
2230: 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28   PGHDR_TO_EXTRA(
2240: 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28  G,P) ((void*)&((
2250: 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d 29 29  char*)(&(G)[1]))
2260: 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d 29  [(P)->pageSize])
2270: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2280: 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c  O_HIST(P,PGR)  \
2290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50  .            ((P
22a0: 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61  gHistory*)&((cha
22b0: 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50  r*)(&(P)[1]))[(P
22c0: 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28 50  GR)->pageSize+(P
22d0: 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f  GR)->nExtra])../
22e0: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
22f0: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
2300: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2310: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2320: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72  ..**.** Pager.er
2330: 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74  rCode may be set
2340: 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   to SQLITE_IOERR
2350: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
2360: 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  , SQLITE_PROTOCO
2370: 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46  L.** or SQLITE_F
2380: 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66  ULL. Once one of
2390: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
23a0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20   errors occurs, 
23b0: 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61  it persists.** a
23c0: 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  nd is returned a
23d0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
23e0: 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65  every major page
23f0: 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65  r API call.  The
2400: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
2410: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
2420: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
2430: 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f  t. It persists o
2440: 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  nly until the.**
2450: 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75 6c   next successful
2460: 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72   rollback is per
2470: 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61  formed on the pa
2480: 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c  ger cache. Also,
2490: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
24a0: 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20  does not affect 
24b0: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
24c0: 5f 67 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  _get() and sqlit
24d0: 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29  e3pager_lookup()
24e0: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
24f0: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
2500: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
2510: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
2520: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65  .  u8 journalOpe
2530: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2540: 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2550: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
2560: 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  rs is valid */. 
2570: 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74   u8 journalStart
2580: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
2590: 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f  True if header o
25a0: 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  f journal is syn
25b0: 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ced */.  u8 useJ
25c0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
25d0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
25e0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
25f0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
2600: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2620: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2630: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2640: 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70  s */.  u8 stmtOp
2650: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2660: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2670: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2680: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
2690: 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65  /.  u8 stmtInUse
26a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26b0: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
26c0: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  n a statement su
26d0: 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  btransaction */.
26e0: 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65    u8 stmtAutoope
26f0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
2700: 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e   Open stmt journ
2710: 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75  al when main jou
2720: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f  rnal is opened*/
2730: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2750: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
2760: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
2770: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
2780: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2790: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
27a0: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
27b0: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
27c0: 73 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 5f  ss */.  u8 full_
27d0: 66 73 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  fsync;          
27e0: 20 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55 4c      /* Use F_FUL
27f0: 4c 46 53 59 4e 43 20 77 68 65 6e 20 61 76 61 69  LFSYNC when avai
2800: 6c 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74  lable */.  u8 st
2810: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2820: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
2830: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
2840: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
2850: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2860: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2870: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
2880: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2890: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
28a0: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
28b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
28c0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
28d0: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
28e0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
28f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2900: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2910: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2920: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2930: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2940: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2950: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
2960: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
2970: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
2980: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
2990: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
29a0: 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70  back() for all p
29b0: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d  ages */.  u8 mem
29c0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
29d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
29e0: 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c   inhibit all fil
29f0: 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65  e I/O */.  u8 se
2a00: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2a10: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2a20: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
2a30: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2a40: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   jrnl */.  int e
2a50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
2a60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2a70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
2a80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
2a90: 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  t dbSize;       
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ab0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ac0: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
2ad0: 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20  t origDbSize;   
2ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
2af0: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
2b00: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f  urrent change */
2b10: 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b  .  int stmtSize;
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b30: 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61  * Size of databa
2b40: 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74  se (in pages) at
2b50: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
2b60: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2b90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
2ba0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
2bb0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
2bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
2bd0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
2be0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
2bf0: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74  hecksum */.  int
2c00: 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20   stmtNRec;      
2c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c20: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
2c30: 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c   stmt subjournal
2c40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c60: 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61    /* Add this ma
2c70: 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68  ny bytes to each
2c80: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2c90: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
2ca0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2cb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2cc0: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
2cd0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cf0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2d00: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2d10: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50  s */.  int nMaxP
2d20: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2d30: 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72     /* High water
2d40: 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a   mark of nPage *
2d50: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  /* Number of in-
2d80: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74  memory pages wit
2d90: 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a  h PgHdr.nRef>0 *
2da0: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2dd0: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
2de0: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
2df0: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e10: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2e20: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2e30: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2e40: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2e60: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2e70: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
2e80: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
2e90: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
2ea0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2eb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ec0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
2ed0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2ee0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2ef0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65  */.  char *zDire
2f10: 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20  ctory;          
2f20: 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f   /* Directory ho
2f30: 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ld database and 
2f40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2f50: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a  .  OsFile *fd, *
2f60: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  jfd;           /
2f70: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2f80: 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  rs for database 
2f90: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  and journal */. 
2fa0: 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20 20   OsFile *stfd;  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fc0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2fd0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
2fe0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20  t subjournal*/. 
2ff0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
3000: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
3010: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
3020: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
3030: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
3040: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
3050: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
3060: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
3070: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
3080: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
3090: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
30a0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
30b0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
30c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30d0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
30e0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
30f0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
3100: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3110: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
3120: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
3130: 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  nal */.  PgHdr *
3140: 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20  pDirty;         
3150: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3160: 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
3170: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
3180: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3190: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
31a0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
31b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
31c0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31e0: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
31f0: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
3200: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
3210: 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20  stmtHdrOff;     
3220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3230: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3240: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
3250: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  tement */.  i64 
3260: 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20  stmtCksum;      
3270: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
3280: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
3290: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
32a0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69  */.  i64 stmtJSi
32b0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
32c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
32d0: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
32e0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63  n() */.  int sec
32f0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
3300: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
3310: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
3320: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23  ng rollback */.#
3330: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
3340: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
3350: 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20  iss, nOvfl;     
3360: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d  /* Cache hits, m
3370: 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20  issing, and LRU 
3380: 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 69  overflows */.  i
3390: 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65 3b  nt nRead,nWrite;
33a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
33b0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
33c0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
33d0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  dif.  void (*xDe
33e0: 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 2c  structor)(void*,
33f0: 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  int); /* Call th
3400: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
3410: 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f  freeing pages */
3420: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
3430: 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b  ter)(void*,int);
3440: 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20     /* Call this 
3450: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
3460: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
3470: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
3480: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3490: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
34a0: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
34b0: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
34c0: 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20  id *pCodecArg;  
34d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
34e0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
34f0: 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 69 6e 74  Codec() */.  int
3500: 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20   nHash;         
3510: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
3520: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
3530: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  sh table */.  Pg
3540: 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20  Hdr **aHash;    
3550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
3560: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
3570: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
3580: 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Hdr */.#ifdef SQ
3590: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
35a0: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
35b0: 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20  Pager *pNext;   
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
35d0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
35e0: 67 65 72 73 20 69 6e 20 74 68 69 73 20 74 68 72  gers in this thr
35f0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ead */.#endif.};
3600: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
3610: 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65  E_TEST is define
3620: 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  d then increment
3630: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 67 69   the variable gi
3640: 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72  ven in.** the ar
3650: 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66  gument.*/.#ifdef
3660: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64   SQLITE_TEST.# d
3670: 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28  efine TEST_INCR(
3680: 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20  x)  x++.#else.# 
3690: 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52  define TEST_INCR
36a0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
36b0: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
36c0: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
36d0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
36e0: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
36f0: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
3700: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
3710: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
3720: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
3730: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
3740: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
3750: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
3760: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
3770: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
3780: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
3790: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
37a0: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
37b0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
37c0: 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74  s begin.** writt
37d0: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
37e0: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
37f0: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
3800: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
3810: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
3820: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
3830: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
3840: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
3850: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
3860: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
3870: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
3880: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
3890: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
38a0: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
38b0: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
38c0: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
38d0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
38e0: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
38f0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
3900: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
3910: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
3920: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
3930: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
3940: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
3950: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
3960: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
3970: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
3980: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
3990: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
39a0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
39b0: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
39c0: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
39d0: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
39e0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
39f0: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
3a00: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
3a10: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3a20: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
3a30: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
3a40: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
3a50: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
3a60: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
3a70: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
3a80: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
3a90: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
3aa0: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
3ab0: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
3ac0: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
3ad0: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
3ae0: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
3af0: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
3b00: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
3b10: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
3b20: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
3b30: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
3b40: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
3b50: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
3b60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
3b70: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
3b80: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
3b90: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
3ba0: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
3bb0: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
3bc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
3bd0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
3be0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
3bf0: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
3c00: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
3c10: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
3c20: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
3c30: 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
3c40: 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70  er and of each p
3c50: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
3c60: 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  al is determined
3c70: 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f  .** by the follo
3c80: 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  wing macros..*/.
3c90: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3ca0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
3cb0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
3cc0: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
3cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
3ce0: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
3cf0: 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75  pager. In the fu
3d00: 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64  ture, this could
3d10: 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f   be.** set to so
3d20: 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  me value read fr
3d30: 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74  om the disk cont
3d40: 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f  roller. The impo
3d50: 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74  rtant.** charact
3d60: 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20  eristic is that 
3d70: 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73  it is the same s
3d80: 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65  ize as a disk se
3d90: 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ctor..*/.#define
3da0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
3db0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
3dc0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
3dd0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
3de0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
3df0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
3e00: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
3e10: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
3e20: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
3e30: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
3e40: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
3e50: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
3e60: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
3e70: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
3e80: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
3e90: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
3ea0: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
3eb0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
3ec0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
3ed0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
3ee0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
3ef0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
3f00: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
3f10: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
3f20: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
3f30: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
3f40: 73 69 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73  size of a disk s
3f50: 65 63 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  ector.*/.#define
3f60: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
3f70: 5a 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61  ZE 512../*.** Pa
3f80: 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f  ge number PAGER_
3f90: 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72  MJ_PGNO is never
3fa0: 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69   used in an SQLi
3fb0: 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20  te database (it 
3fc0: 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66  is.** reserved f
3fd0: 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e  or working aroun
3fe0: 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69  d a windows/posi
3ff0: 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74  x incompatibilit
4000: 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65  y). It is.** use
4010: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
4020: 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74   to signify that
4030: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
4040: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
4050: 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65  le .** is devote
4060: 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d  d to storing a m
4070: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
4080: 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e  me - there are n
4090: 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a  o more pages to.
40a0: 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65  ** roll back. Se
40b0: 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66  e comments for f
40c0: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73  unction writeMas
40d0: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
40e0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20   details..*/./* 
40f0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
4100: 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e  _PGNO(x) (PENDIN
4110: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
4120: 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69  eSize)) */.#defi
4130: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
4140: 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59  (x) ((PENDING_BY
4150: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
4160: 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  e))+1)../*.** Th
4170: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
4180: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
4190: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
41a0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
41b0: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
41c0: 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65  ./*.** Enable re
41d0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72  ference count tr
41e0: 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75  acking (for debu
41f0: 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a  gging) here:.*/.
4200: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4210: 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f  ST.  int pager3_
4220: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d  refinfo_enable =
4230: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69   0;.  static voi
4240: 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28  d pager_refinfo(
4250: 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73  PgHdr *p){.    s
4260: 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20  tatic int cnt = 
4270: 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  0;.    if( !page
4280: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4290: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
42a0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
42b0: 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43  tf(.       "REFC
42c0: 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20  NT: %4d addr=%p 
42d0: 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  nRef=%d\n",.    
42e0: 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44     p->pgno, PGHD
42f0: 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d  R_TO_DATA(p), p-
4300: 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20  >nRef.    );.   
4310: 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d   cnt++;   /* Som
4320: 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20  ething to set a 
4330: 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f  breakpoint on */
4340: 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45  .  }.# define RE
4350: 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f  FINFO(X)  pager_
4360: 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65  refinfo(X).#else
4370: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
4380: 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  O(X).#endif.../*
4390: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
43a0: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
43b0: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e   hash table to N
43c0: 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70  .  N must be a p
43d0: 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a  ower.** of two..
43e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
43f0: 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
4400: 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50  _table(Pager *pP
4410: 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  ager, int N){.  
4420: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a  PgHdr **aHash, *
4430: 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e  pPg;.  assert( N
4440: 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d  >0 && (N&(N-1))=
4450: 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20  =0 );.  aHash = 
4460: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
4470: 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e  zeof(aHash[0])*N
4480: 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d   );.  if( aHash=
4490: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  =0 ){.    /* Fai
44a0: 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69  lure to rehash i
44b0: 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20  s not an error. 
44c0: 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65   It is only a pe
44d0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a  rformance hit. *
44e0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
44f0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
4500: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
4510: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
4520: 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   N;.  pPager->aH
4530: 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66  ash = aHash;.  f
4540: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
4550: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
4560: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
4570: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28    int h;.    if(
4580: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
4590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
45a0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
45b0: 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
45c0: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  sh==0 );.      c
45d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
45e0: 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f     h = pPg->pgno
45f0: 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50   & (N-1);.    pP
4600: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61  g->pNextHash = a
4610: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28  Hash[h];.    if(
4620: 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20   aHash[h] ){.   
4630: 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72     aHash[h]->pPr
4640: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
4650: 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d    }.    aHash[h]
4660: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d   = pPg;.    pPg-
4670: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
4680: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
4690: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
46a0: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
46b0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
46c0: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
46d0: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
46e0: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
46f0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4700: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
4710: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
4720: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4730: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4740: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
4750: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
4760: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
4770: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
4780: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
4790: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
47a0: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
47b0: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
47c0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
47d0: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
47e0: 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20   sizeof(ac));.  
47f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4800: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
4810: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4820: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4830: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
4840: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
4860: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4870: 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20  r into a string 
4880: 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e  buffer in big-en
4890: 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e  dian byte order.
48a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
48b0: 70 75 74 33 32 62 69 74 73 28 63 68 61 72 20 2a  put32bits(char *
48c0: 61 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  ac, u32 val){.  
48d0: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
48e0: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
48f0: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
4900: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
4910: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
4920: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
4930: 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
4940: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4950: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
4960: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4970: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
4980: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
4990: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
49a0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
49b0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
49c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
49d0: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
49e0: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
49f0: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
4a00: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
4a10: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
4a20: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
4a30: 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   ac, 4);.}../*.*
4a40: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
4a50: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
4a60: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
4a70: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
4a80: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
4a90: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
4aa0: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
4ab0: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
4ac0: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
4ad0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4ae0: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
4af0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
4b00: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
4b10: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
4b20: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4b30: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4b40: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
4b50: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
4b60: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
4b70: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
4b80: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
4b90: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a  ithin the pager.
4ba0: 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72  ** code. The fir
4bb0: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
4bc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4bd0: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
4be0: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74   the.** second t
4bf0: 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
4c00: 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
4c10: 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
4c20: 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20  I function. .** 
4c30: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
4c40: 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
4c50: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4c60: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
4c70: 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
4c80: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4c90: 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f  ent is SQLITE_IO
4ca0: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
4cb0: 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52  UPT or SQLITE_PR
4cc0: 4f 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65  OTOCOL,.** the e
4cd0: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
4ce0: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
4cf0: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4d00: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
4d10: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
4d20: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
4d30: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
4d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4d50: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
4d60: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
4d70: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
4d80: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
4d90: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
4da0: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
4db0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
4dc0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
4dd0: 0a 20 20 69 66 28 20 0a 20 20 20 20 72 63 32 3d  .  if( .    rc2=
4de0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
4df0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
4e00: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
4e10: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
4e20: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4e30: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29  ITE_PROTOCOL.  )
4e40: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
4e50: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
4e60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4e70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
4e80: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
4e90: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
4ea0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
4eb0: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
4ec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
4ed0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
4ee0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75  Hdr *pPage){.  u
4ef0: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
4f00: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
4f10: 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28   char *pData = (
4f20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
4f30: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
4f40: 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  age);.  for(i=0;
4f50: 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72   i<pPage->pPager
4f60: 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29  ->pageSize; i++)
4f70: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
4f80: 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a  sh+i)^pData[i];.
4f90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
4fa0: 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  h;.}../*.** The 
4fb0: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
4fc0: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
4fd0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
4fe0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
4ff0: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
5000: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
5010: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
5020: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
5030: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
5040: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
5050: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
5060: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
5070: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
5080: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
5090: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
50a0: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
50b0: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
50c0: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
50d0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
50e0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
50f0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
5100: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
5110: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
5120: 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69  MEMDB || pPg->di
5130: 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50  rty || .      pP
5140: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
5150: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
5160: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
5170: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
5180: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
5190: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
51a0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
51b0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
51c0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
51d0: 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74  pen..** The mast
51e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
51f0: 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f  name is read fro
5200: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
5210: 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72   file and .** wr
5220: 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
5230: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
5240: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20  sqliteMalloc(). 
5250: 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20  *pzMaster is.** 
5260: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  set to point at 
5270: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  the memory and S
5280: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
5290: 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
52a0: 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65  st.** sqliteFree
52b0: 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a  () *pzMaster..**
52c0: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
52d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
52e0: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70  me is present *p
52f0: 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74  zMaster is set t
5300: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
5310: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5320: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5330: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f  dMasterJournal(O
5340: 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  sFile *pJrnl, ch
5350: 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a  ar **pzMaster){.
5360: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
5370: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
5380: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
5390: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
53a0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
53b0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
53c0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
53d0: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d  eader */..  *pzM
53e0: 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63  aster = 0;..  rc
53f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
5400: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
5410: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5420: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
5430: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5440: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5450: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
5460: 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  6);.  if( rc!=SQ
5470: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5480: 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65   rc;. .  rc = re
5490: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
54a0: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
54b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
54c0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
54d0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
54e0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  , &cksum);.  if(
54f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5510: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5520: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
5530: 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   8);.  if( rc!=S
5540: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
5550: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
5560: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
5570: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5580: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
5590: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65  pJrnl, szJ-16-le
55a0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
55b0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
55c0: 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65   rc;..  *pzMaste
55d0: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
55e0: 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b  teMalloc(len+1);
55f0: 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65  .  if( !*pzMaste
5600: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
5610: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5620: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
5630: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70  OsRead(pJrnl, *p
5640: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
5650: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5660: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
5670: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
5680: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
5690: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   0;.    return r
56a0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
56b0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
56c0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
56d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
56e0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
56f0: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
5700: 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73  cksum -= (*pzMas
5710: 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69  ter)[i];.  }.  i
5720: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
5730: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
5740: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
5750: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
5760: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
5770: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
5780: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
5790: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
57a0: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
57b0: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
57c0: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
57d0: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
57e0: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
57f0: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
5800: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
5810: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
5820: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
5830: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
5840: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
5850: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d  zMaster = 0;.  }
5860: 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61  else{.    (*pzMa
5870: 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30  ster)[len] = '\0
5880: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
5890: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
58a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
58b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
58c0: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
58d0: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
58e0: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
58f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
5900: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
5910: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
5920: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
5930: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
5940: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
5950: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
5960: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
5970: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
5980: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
5990: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
59a0: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
59d0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
59e0: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
59f0: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
5a00: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
5a10: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
5a20: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5a30: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
5a40: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
5a50: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ** .*/.static in
5a60: 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  t seekJournalHdr
5a70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
5a80: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
5a90: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
5aa0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5ab0: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
5ac0: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
5ad0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5ae0: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
5af0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5b00: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
5b10: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
5b20: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5b30: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
5b40: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
5b50: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
5b60: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
5b70: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
5b80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5b90: 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72  ff = offset;.  r
5ba0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53  eturn sqlite3OsS
5bb0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
5bc0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5bd0: 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Off);.}../*.** T
5be0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5bf0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
5c00: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
5c10: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
5c20: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
5c30: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
5c40: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
5c50: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
5c60: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
5c70: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
5c80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
5c90: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
5ca0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
5cb0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
5cc0: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
5cd0: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
5ce0: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
5cf0: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
5d00: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
5d10: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
5d20: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
5d30: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
5d40: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
5d50: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
5d60: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
5d70: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
5d80: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
5d90: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
5da0: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
5db0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
5dc0: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
5dd0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
5de0: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
5df0: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
5e00: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
5e10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
5e20: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
5e30: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5e40: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
5e50: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5e60: 69 63 29 2b 31 36 5d 3b 0a 0a 20 20 69 6e 74 20  ic)+16];..  int 
5e70: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
5e80: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
5e90: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5ea0: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
5eb0: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
5ec0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5ed0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
5ee0: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
5ef0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
5f00: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
5f10: 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20  ournalHdr;.  }. 
5f20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5f30: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
5f40: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a  DR_SZ(pPager);..
5f50: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20    /* FIX ME: .  
5f60: 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  **.  ** Possibly
5f70: 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74   for a pager not
5f80: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
5f90: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61  , the journal ma
5fa0: 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20  gic should not. 
5fb0: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75   ** be written u
5fc0: 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c  ntil nRec is fil
5fd0: 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f  led in as part o
5fe0: 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e  f next syncJourn
5ff0: 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  al(). .  **.  **
6000: 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20   Actually maybe 
6010: 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
6020: 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20  l header should 
6030: 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  be delayed until
6040: 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74   that.  ** point
6050: 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  . Think about th
6060: 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  is..  */.  memcp
6070: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
6080: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
6090: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
60a0: 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20  ;.  /* The nRec 
60b0: 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46  Field. 0xFFFFFFF
60c0: 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f  F for no-sync jo
60d0: 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74  urnals. */.  put
60e0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
60f0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6100: 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
6110: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
6120: 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54  fff : 0);.  /* T
6130: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
6140: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
6150: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61   */ .  sqlite3Ra
6160: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
6170: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6180: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
6190: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
61a0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
61b0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
61c0: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
61d0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
61e0: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
61f0: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
6200: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6210: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6220: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
6230: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
6240: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
6250: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
6260: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
6270: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6280: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6290: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
62a0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
62b0: 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
62c0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
62d0: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
62e0: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
62f0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
6300: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
6310: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
6320: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
6330: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
6340: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6350: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
6360: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6370: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
6380: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6390: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
63a0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
63b0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
63c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a  >journalOff-1);.
63d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
63e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
63f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6400: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6410: 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20  "\000", 1);.    
6420: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6430: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
6440: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
6450: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
6460: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
6470: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6480: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
6490: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
64a0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
64b0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
64c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
64d0: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
64e0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
64f0: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6500: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6510: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6520: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6530: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
6540: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
6550: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
6560: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
6570: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
6580: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
6590: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
65a0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
65b0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
65c0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
65d0: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
65e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
65f0: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6600: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6610: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6620: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
6630: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6640: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
6650: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6660: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
6670: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
6680: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6690: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
66a0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
66b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
66c0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
66d0: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
66e0: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
66f0: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6700: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6710: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6720: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
6730: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
6740: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
6750: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
6760: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
6770: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
6780: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
6790: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
67a0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
67b0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
67c0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
67d0: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
67e0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
67f0: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
6800: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6810: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6820: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6830: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
6840: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
6850: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6860: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
6870: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6880: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6890: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
68a0: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
68b0: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
68c0: 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28  (aMagic));.  if(
68d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
68e0: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
68f0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
6900: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6910: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
6920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6930: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6940: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6950: 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a  r->jfd, pNRec);.
6960: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6970: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
6980: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
6990: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
69a0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
69b0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
69c0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
69d0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
69e0: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
69f0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6a00: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
6a10: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
6a20: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
6a30: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
6a40: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
6a50: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
6a60: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
6a70: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
6a80: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
6a90: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
6aa0: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
6ab0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
6ac0: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
6ad0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
6ae0: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
6af0: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
6b00: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
6b10: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
6b20: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
6b30: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
6b40: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
6b50: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
6b60: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20  ager->jfd, (u32 
6b70: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
6b80: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
6b90: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6ba0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6bb0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
6bc0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
6bd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
6be0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
6bf0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6c00: 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Off);.  return r
6c10: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
6c20: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
6c30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6c40: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
6c50: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
6c60: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
6c70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
6c80: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
6c90: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
6ca0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
6cb0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
6cc0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
6cd0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
6ce0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
6cf0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
6d00: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
6d10: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
6d20: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
6d30: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
6d40: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
6d50: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
6d60: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
6d70: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
6d80: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
6d90: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
6da0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
6db0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
6dc0: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
6dd0: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
6de0: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
6df0: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
6e00: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
6e10: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
6e20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
6e30: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
6e40: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
6e50: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
6e60: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
6e70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
6e80: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
6e90: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
6ea0: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
6eb0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
6ec0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
6ed0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
6ee0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
6ef0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
6f00: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
6f10: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
6f20: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
6f30: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
6f40: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
6f50: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
6f60: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6f70: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
6f80: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
6f90: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20  ger->setMaster) 
6fa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6fb0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
6fc0: 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65  aster = 1;..  le
6fd0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74  n = strlen(zMast
6fe0: 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  er);.  for(i=0; 
6ff0: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
7000: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
7010: 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  r[i];.  }..  /* 
7020: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
7030: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
7040: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
7050: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
7060: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
7070: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7080: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
7090: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
70a0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
70b0: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
70c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
70d0: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
70e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
70f0: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
7100: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
7110: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
7120: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7130: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
7140: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
7150: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
7160: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
7170: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
7180: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
7190: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
71a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
71b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
71c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
71d0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
71e0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
71f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7200: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7210: 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42  ..  put32bits(zB
7220: 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33  uf, len);.  put3
7230: 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20  2bits(&zBuf[4], 
7240: 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79  cksum);.  memcpy
7250: 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72  (&zBuf[8], aJour
7260: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
7270: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
7280: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7290: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
72a0: 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a  jfd, zBuf, 8+siz
72b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
72c0: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
72d0: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
72e0: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74  r->noSync;.  ret
72f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7300: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
7310: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
7320: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
7330: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
7340: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
7350: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
7360: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
7370: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
7380: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
7390: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
73a0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
73b0: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
73c0: 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67  s the sqlite3pag
73d0: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29  er_stmt_commit()
73e0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20  .** routine run 
73f0: 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20  MUCH faster for 
7400: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
7410: 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20  where there are 
7420: 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e  many.** pages in
7430: 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79   memory but only
7440: 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68   a few are in th
7450: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
7460: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
7470: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
7480: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
7490: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
74a0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
74b0: 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
74c0: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
74d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
74e0: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
74f0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d   pPg->pNextStmt=
7500: 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72  =0 );.  pPg->pPr
7510: 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  evStmt = 0;.  if
7520: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
7530: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
7540: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
7550: 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
7560: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
7570: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70  ager->pStmt;.  p
7580: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
7590: 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d  Pg;.  pPg->inStm
75a0: 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20  t = 1;.}.static 
75b0: 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65  void page_remove
75c0: 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
75d0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
75e0: 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  f( !pPg->inStmt 
75f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
7600: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29  pPg->pPrevStmt )
7610: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7620: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
7630: 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  extStmt==pPg );.
7640: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
7650: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  mt->pNextStmt = 
7660: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
7670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
7680: 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
7690: 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  ->pStmt==pPg );.
76a0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
76b0: 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  >pStmt = pPg->pN
76c0: 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69  extStmt;.  }.  i
76d0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  f( pPg->pNextStm
76e0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
76f0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
7700: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20  >pPrevStmt==pPg 
7710: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
7720: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
7730: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d   = pPg->pPrevStm
7740: 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  t;.  }.  pPg->pN
7750: 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  extStmt = 0;.  p
7760: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
7770: 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  0;.  pPg->inStmt
7780: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   = 0;.}../*.** F
7790: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
77a0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
77b0: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
77c0: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
77d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
77e0: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
77f0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
7800: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
7810: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
7820: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
7830: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  o){.  PgHdr *p;.
7840: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
7850: 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ash==0 ) return 
7860: 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d  0;.  p = pPager-
7870: 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70  >aHash[pgno & (p
7880: 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
7890: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
78a0: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
78b0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
78c0: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
78d0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
78e0: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
78f0: 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ase and clear th
7900: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
7910: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
7920: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
7930: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
7940: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
7950: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
7960: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
7970: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
7980: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
7990: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
79a0: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
79b0: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
79c0: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
79d0: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
79e0: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
79f0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7a00: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
7a10: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
7a20: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  Pg, *pNext;.  if
7a30: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
7a40: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
7a50: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7a60: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
7a70: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
7a80: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
7a90: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
7aa0: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
7ab0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
7ac0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
7ad0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
7ae0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
7af0: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
7b00: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48   0;.  pPager->nH
7b10: 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ash = 0;.  sqlit
7b20: 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  eFree(pPager->aH
7b30: 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ash);.  pPager->
7b40: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61  nPage = 0;.  pPa
7b50: 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a  ger->aHash = 0;.
7b60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7b70: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
7b80: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7b90: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
7ba0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7bb0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7bc0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7bd0: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
7be0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
7bf0: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
7c00: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
7c10: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
7c20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7c30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
7c40: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
7c50: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7c60: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7c70: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7c80: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7c90: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
7ca0: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
7cb0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
7cc0: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
7cd0: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
7ce0: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
7cf0: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7d00: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7d10: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
7d20: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
7d30: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
7d40: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
7d50: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
7d60: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
7d70: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
7d80: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
7d90: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
7da0: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
7db0: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
7dc0: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
7dd0: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
7de0: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
7df0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
7e00: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
7e10: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
7e20: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
7e30: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
7e40: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
7e50: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
7e60: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
7e70: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
7e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7e90: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
7ea0: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
7eb0: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
7ec0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
7ed0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
7ee0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
7ef0: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
7f00: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
7f10: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
7f20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7f30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7f40: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7f50: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
7f60: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
7f70: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
7f80: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
7f90: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
7fa0: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
7fb0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
7fc0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
7fd0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
7fe0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
7ff0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
8000: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
8010: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
8020: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
8030: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
8040: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
8050: 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  nc = 0;.#ifdef S
8060: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
8070: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
8080: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
8090: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
80a0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
80b0: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
80c0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
80d0: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
80e0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
80f0: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
8100: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8110: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
8120: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
8130: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
8140: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75  ==0 || pPager->u
8150: 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  seJournal==0 );.
8160: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
8170: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
8180: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
8190: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
81a0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
81b0: 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f  RED;.  pPager->o
81c0: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
81d0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
81e0: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
81f0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
8200: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
8210: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
8220: 3e 70 46 69 72 73 74 3b 0a 20 20 72 65 74 75 72  >pFirst;.  retur
8230: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
8240: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
8250: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  n a checksum for
8260: 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74   the page of dat
8270: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  a..**.** This is
8280: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
8290: 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61  ksum.  It is rea
82a0: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
82b0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
82c0: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
82d0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75   and the page nu
82e0: 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69  mber.  We experi
82f0: 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  mented with.** a
8300: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
8310: 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75   entire data, bu
8320: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
8330: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
8340: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
8350: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8360: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
8370: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
8380: 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ata and.** the c
8390: 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
83a0: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
83b0: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
83c0: 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  .  If journal.**
83d0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
83e0: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
83f0: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
8400: 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61  ost likely scena
8410: 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f  rio.** is that o
8420: 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
8430: 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
8440: 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
8450: 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63  d.  It is.** muc
8460: 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
8470: 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
8480: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
8490: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
84a0: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
84b0: 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
84c0: 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
84d0: 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
84e0: 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
84f0: 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
8500: 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
8510: 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
8520: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a  corruption..**.*
8530: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69  * FIX ME:  Consi
8540: 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79  der adding every
8550: 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62   200th (or so) b
8560: 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  yte of the data 
8570: 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  to the.** checks
8580: 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66  um.  That way if
8590: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73   a single page s
85a0: 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64  pans 3 or more d
85b0: 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a  isk sectors and.
85c0: 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64  ** only the midd
85d0: 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72  le sector is cor
85e0: 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74  rupt, we will st
85f0: 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f  ill have a reaso
8600: 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20  nable.** chance 
8610: 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63  of failing the c
8620: 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73  hecksum and thus
8630: 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70   detecting the p
8640: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  roblem..*/.stati
8650: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
8660: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
8670: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
8680: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
8690: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
86a0: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
86b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
86c0: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
86d0: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
86e0: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
86f0: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
8700: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
8710: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
8720: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
8730: 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
8740: 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  PgHdr*);../*.** 
8750: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
8760: 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ge from the jour
8770: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  nal file opened 
8780: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
8790: 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79  or.** jfd.  Play
87a0: 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61  back this one pa
87b0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65  ge..**.** If use
87c0: 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e  Cksum==0 it mean
87d0: 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64  s this journal d
87e0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63  oes not use chec
87f0: 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d  ksums.  Checksum
8800: 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65  s.** are not use
8810: 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a  d in statement j
8820: 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20  ournals because 
8830: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8840: 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65  ls do not.** nee
8850: 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77  d to survive pow
8860: 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a  er failures..*/.
8870: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8880: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
8890: 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
88a0: 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69  , OsFile *jfd, i
88b0: 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20  nt useCksum){.  
88c0: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
88d0: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
88e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
88f0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
8900: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
8910: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
8920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8930: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
8940: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
8950: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
8960: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
8970: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
8980: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
8990: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
89a0: 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45   u8 aData[SQLITE
89b0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b  _MAX_PAGE_SIZE];
89c0: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
89d0: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
89e0: 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73  .  /* useCksum s
89f0: 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f  hould be true fo
8a00: 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  r the main journ
8a10: 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  al and false for
8a20: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
8a30: 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66  journals.  Verif
8a40: 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61  y that this is a
8a50: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
8a60: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66   */.  assert( jf
8a70: 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f  d == (useCksum ?
8a80: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
8a90: 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a  Pager->stfd) );.
8aa0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
8ab0: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
8ac0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8ad0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8ae0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8af0: 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61  OsRead(jfd, &aDa
8b00: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
8b10: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
8b20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8b30: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
8b40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
8b50: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8b60: 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69   + 4;..  /* Sani
8b70: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
8b80: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
8b90: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
8ba0: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
8bb0: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
8bc0: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
8bd0: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
8be0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
8bf0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
8c00: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
8c10: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
8c20: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
8c30: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
8c40: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
8c50: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
8c60: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
8c70: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
8c80: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
8c90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
8ca0: 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
8cb0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
8cc0: 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
8cd0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
8ce0: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75   }.  if( pgno>(u
8cf0: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
8d00: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
8d10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d20: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73    }.  if( useCks
8d30: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  um ){.    rc = r
8d40: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
8d50: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
8d60: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
8d70: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
8d80: 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
8d90: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
8da0: 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21  (pPager, aData)!
8db0: 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
8dc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
8dd0: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
8de0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8df0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
8e00: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
8e10: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
8e20: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
8e30: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
8e40: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
8e50: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
8e60: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
8e70: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
8e80: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
8e90: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
8ea0: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
8eb0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
8ec0: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
8ed0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
8ee0: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
8ef0: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
8f00: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
8f10: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
8f20: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
8f30: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
8f40: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
8f50: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
8f60: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
8f70: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
8f80: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
8f90: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
8fa0: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
8fb0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
8fc0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
8fd0: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
8fe0: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
8ff0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
9000: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
9010: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
9020: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
9030: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
9040: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
9050: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
9060: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
9070: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
9080: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
9090: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
90a0: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
90b0: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
90c0: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
90d0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
90e0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
90f0: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
9100: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
9110: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
9120: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
9130: 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72  re in the main r
9140: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
9150: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
9160: 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c  , if a full ROLL
9170: 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65  BACK occurs afte
9180: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  r the statement.
9190: 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68    ** rollback th
91a0: 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  e full ROLLBACK 
91b0: 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65  will not restore
91c0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73   the page to its
91d0: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63   original.  ** c
91e0: 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e  ontent.  Two con
91f0: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  ditions must be 
9200: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
9210: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
9220: 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28  se.  ** files. (
9230: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
9240: 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20  must be locked. 
9250: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
9260: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  t the original. 
9270: 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74   ** page content
9280: 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   is in the main 
9290: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
92a0: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
92b0: 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63  is not in.  ** c
92c0: 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20  ache or else it 
92d0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
92e0: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20  dSync==0..  */. 
92f0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
9300: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
9310: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9320: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9330: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
9340: 50 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45  Pg!=0 );.  TRACE
9350: 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  3("PLAYBACK %d p
9360: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
9370: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
9380: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9390: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
93a0: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
93b0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
93c0: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
93d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
93e0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
93f0: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
9400: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9410: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9420: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9430: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9440: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
9450: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9460: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9470: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
9480: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
9490: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
94a0: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
94b0: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
94c0: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
94d0: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
94e0: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
94f0: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
9500: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
9510: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
9520: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
9530: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
9540: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
9550: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
9560: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
9570: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
9580: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
9590: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
95a0: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
95b0: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
95c0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
95d0: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
95e0: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
95f0: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
9600: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
9610: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50  g->nRef==0 || pP
9620: 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f  g->pgno==1 ); */
9630: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48  .    pData = PGH
9640: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
9650: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
9660: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
9670: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9680: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
9690: 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a  structor ){  /**
96a0: 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c  * FIX ME:  Shoul
96b0: 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69  d this be xReini
96c0: 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50  t? ***/.      pP
96d0: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
96e0: 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  r(pData, pPager-
96f0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9700: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
9710: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
9720: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
9730: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
9740: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
9750: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
9760: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
9770: 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   3);.  }.  retur
9780: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
9790: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
97a0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
97b0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
97c0: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
97d0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
97e0: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
97f0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9800: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
9810: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
9820: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
9830: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
9840: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
9850: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
9860: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
9870: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
9880: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
9890: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
98a0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
98b0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
98c0: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
98d0: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
98e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
98f0: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
9900: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
9910: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
9920: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
9930: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
9940: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
9950: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
9960: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
9970: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
9980: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
9990: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
99a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
99b0: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63  ager_delmaster(c
99c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
99d0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
99e0: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
99f0: 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a   = 0;.  OsFile *
9a00: 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68  master = 0;.  ch
9a10: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
9a20: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
9a30: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
9a40: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
9a50: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
9a60: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
9a70: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
9a80: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
9a90: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
9aa0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
9ab0: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
9ac0: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
9ad0: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
9ae0: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
9af0: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
9b00: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
9b10: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
9b20: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
9b30: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
9b40: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
9b50: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
9b60: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
9b70: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9b80: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
9b90: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9ba0: 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61 73 74 65  OsFileSize(maste
9bb0: 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
9bc0: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
9bd0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
9be0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
9bf0: 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
9c00: 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
9c10: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
9c20: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
9c30: 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  tr = 0;..    /* 
9c40: 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
9c50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9c60: 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
9c70: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20  btained from.   
9c80: 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63   ** sqliteMalloc
9c90: 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
9ca0: 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
9cb0: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
9cc0: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
9cd0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
9ce0: 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
9cf0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  urnal);.    if( 
9d00: 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
9d10: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
9d20: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9d30: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
9d40: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
9d50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
9d60: 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74  ad(master, zMast
9d70: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
9d80: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
9d90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9da0: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
9db0: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
9dc0: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
9dd0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
9de0: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
9df0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
9e00: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
9e10: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9e20: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f  OsFileExists(zJo
9e30: 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  urnal) ){.      
9e40: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
9e50: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
9e60: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
9e70: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
9e80: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
9e90: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
9ea0: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
9eb0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9ec0: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
9ed0: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
9ee0: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
9ef0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9f00: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
9f10: 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20  .        OsFile 
9f20: 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  *journal = 0;.  
9f30: 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20        int c;..  
9f40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9f50: 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
9f60: 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72  (zJournal, &jour
9f70: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
9f80: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9f90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
9fa0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
9fb0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
9fc0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
9fd0: 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e  terJournal(journ
9fe0: 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29  al, &zMasterPtr)
9ff0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a000: 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61  3OsClose(&journa
a010: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
a020: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a030: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
a040: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
a050: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
a060: 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
a070: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
a080: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
a090: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73  r)==0;.        s
a0a0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
a0b0: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69  rPtr);.        i
a0c0: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
a0d0: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
a0e0: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
a0f0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
a100: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
a110: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
a120: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
a130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a140: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
a150: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
a160: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
a170: 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73  }.  .  sqlite3Os
a180: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
a190: 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
a1a0: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
a1b0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
a1c0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a  iteFree(zMasterJ
a1d0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
a1e0: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
a1f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
a200: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
a210: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
a230: 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
a240: 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69  e cache agree wi
a250: 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
a260: 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  sk.  In other wo
a270: 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74  rds,.** reread t
a280: 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74  he disk to reset
a290: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
a2a0: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
a2b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a2c0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f  alled after a ro
a2d0: 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20  llback in which 
a2e0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74  some of the dirt
a2f0: 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73  y cache.** pages
a300: 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20   had never been 
a310: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64  written out to d
a320: 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  isk.  We need to
a330: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a   roll back the.*
a340: 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20  * cache content 
a350: 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20  and the easiest 
a360: 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69  way to do that i
a370: 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  s to reread the 
a380: 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62  old content.** b
a390: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ack from the dis
a3a0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
a3b0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
a3c0: 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
a3d0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
a3e0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
a3f0: 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50  ITE_OK;.  for(pP
a400: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
a410: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
a420: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61  extAll){.    cha
a430: 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41  r zBuf[SQLITE_MA
a440: 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20  X_PAGE_SIZE];.  
a450: 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74    if( !pPg->dirt
a460: 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
a470: 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
a480: 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
a490: 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
a4a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a4b0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
a4c0: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
a4d0: 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e 70  ize*(i64)(pPg->p
a4e0: 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 69  gno-1));.      i
a4f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a500: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
a510: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
a520: 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
a530: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a540: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a550: 20 20 54 52 41 43 45 33 28 22 52 45 46 45 54 43    TRACE3("REFETC
a560: 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
a570: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
a580: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
a590: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
a5a0: 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31  ak;.      CODEC1
a5b0: 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70  (pPager, zBuf, p
a5c0: 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20  Pg->pgno, 2);.  
a5d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
a5e0: 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70  emset(zBuf, 0, p
a5f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
a600: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a610: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
a620: 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48  memcmp(zBuf, PGH
a630: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
a640: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a650: 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  e) ){.      memc
a660: 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
a670: 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61  (pPg), zBuf, pPa
a680: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a690: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
a6a0: 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
a6b0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
a6c0: 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54  Reiniter(PGHDR_T
a6d0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
a6e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a6f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a700: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
a710: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
a720: 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
a730: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
a740: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
a750: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
a760: 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
a770: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
a780: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
a790: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
a7a0: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
a7b0: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
a7c0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 44    }.  pPager->pD
a7d0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75  irty = 0;.  retu
a7e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a7f0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
a800: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
a810: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
a820: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
a830: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  .** indicated..*
a840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
a850: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
a860: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
a870: 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
a880: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
a890: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
a8a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
a8b0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
a8c0: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
a8d0: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
a8e0: 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nPage);.}../*.**
a8f0: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
a900: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
a910: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
a920: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
a930: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
a940: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
a950: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
a960: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
a970: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
a980: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
a990: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
a9a0: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
a9b0: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
a9c0: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
a9d0: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
a9e0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
a9f0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
aa00: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
aa10: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
aa20: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
aa30: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
aa40: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
aa50: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
aa60: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
aa70: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
aa80: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
aa90: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
aaa0: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
aab0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
aac0: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
aad0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
aae0: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
aaf0: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
ab00: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
ab10: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
ab20: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
ab30: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
ab40: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
ab50: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
ab60: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
ab70: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
ab80: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
ab90: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
aba0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
abb0: 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20  .**       name. 
abc0: 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62   The value may b
abd0: 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65  e zero (indicate
abe0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
abf0: 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  o master.**     
ac00: 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20    journal.).**  
ac10: 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20  (6)  N bytes of 
ac20: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ac30: 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61  al name.  The na
ac40: 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74  me will be nul-t
ac50: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20  erminated.**    
ac60: 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20     and might be 
ac70: 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65  shorter than the
ac80: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
ac90: 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69   (5).  If the fi
aca0: 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  rst byte.**     
acb0: 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73    of the name is
acc0: 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65   \000 then there
acd0: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   is no master jo
ace0: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74  urnal.  The mast
acf0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
ad00: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72  nal name is stor
ad10: 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
ad20: 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (7)  Zero or mo
ad30: 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
ad40: 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
ad50: 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
ad60: 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
ad70: 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
ad80: 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
ad90: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
ada0: 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
adb0: 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
adc0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
add0: 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
ade0: 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
adf0: 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69  an the first 6 i
ae00: 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
ae10: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
ae20: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
ae30: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37  nstance of the 7
ae40: 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
ae50: 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
ae60: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
ae70: 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
ae80: 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
ae90: 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
aea0: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
aeb0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
aec0: 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
aed0: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
aee0: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
aef0: 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
af00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
af10: 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
af20: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
af30: 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
af40: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
af50: 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
af60: 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
af70: 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
af80: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
af90: 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
afa0: 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
afb0: 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
afc0: 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
afd0: 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
afe0: 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
aff0: 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
b000: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
b010: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
b020: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
b030: 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
b040: 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
b050: 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
b060: 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
b070: 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
b080: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
b090: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
b0a0: 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
b0b0: 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
b0c0: 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
b0d0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
b0e0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
b0f0: 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
b100: 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
b110: 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
b120: 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
b130: 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
b140: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
b150: 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
b160: 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
b170: 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
b180: 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
b190: 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
b1a0: 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
b1b0: 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
b1c0: 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
b1d0: 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
b1e0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
b1f0: 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
b200: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
b210: 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
b220: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
b230: 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
b240: 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
b250: 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
b260: 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
b270: 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
b280: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b290: 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
b2a0: 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
b2b0: 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
b2c0: 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
b2d0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
b2e0: 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
b2f0: 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
b300: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
b310: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
b320: 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
b330: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
b340: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
b350: 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
b360: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
b370: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
b380: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b390: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
b3a0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
b3b0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
b3c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
b3d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b3e0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
b3f0: 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
b400: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b410: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
b420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
b430: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b450: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b460: 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
b470: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
b480: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
b490: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
b4a0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4c0: 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
b4d0: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
b4e0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
b4f0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
b500: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
b510: 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
b520: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
b530: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
b540: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
b550: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
b560: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
b570: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
b580: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
b590: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
b5a0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
b5b0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
b5c0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
b5d0: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
b5e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b5f0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
b600: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
b610: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
b620: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
b630: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
b640: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
b650: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
b660: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
b670: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
b680: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
b690: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
b6a0: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
b6b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
b6c0: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
b6d0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
b6e0: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
b6f0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
b700: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
b710: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
b720: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
b730: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
b740: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
b750: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
b760: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
b770: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
b780: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
b790: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
b7a0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
b7b0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
b7c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
b7d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b7e0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b7f0: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
b800: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
b810: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
b820: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
b830: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
b840: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
b850: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
b860: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
b870: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
b880: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
b890: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
b8a0: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
b8b0: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
b8c0: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
b8d0: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
b8e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
b8f0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
b900: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
b910: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
b920: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b930: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
b940: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
b950: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
b960: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
b970: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
b980: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
b990: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
b9a0: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
b9b0: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
b9c0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
b9d0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
b9e0: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
b9f0: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
ba00: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
ba10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ba20: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
ba30: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
ba40: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
ba50: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
ba60: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
ba70: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
ba80: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
ba90: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
baa0: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
bab0: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
bac0: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
bad0: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
bae0: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
baf0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
bb00: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
bb10: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
bb20: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
bb30: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
bb40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
bb50: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
bb60: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
bb70: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
bb80: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
bb90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
bba0: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
bbb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
bbc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
bbd0: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
bbe0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
bbf0: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
bc00: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
bc10: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
bc20: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
bc30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
bc40: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
bc50: 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
bc60: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
bc70: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
bc80: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
bc90: 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20  le back to it's 
bca0: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
bcb0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
bcc0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
bcd0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
bce0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
bcf0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
bd00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
bd10: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  er) ){.      ass
bd20: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
bd30: 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50  gDbSize==0 || pP
bd40: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
bd50: 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20  ==mxPg );.      
bd60: 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
bd70: 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
bd80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
bd90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bda0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
bdb0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
bdc0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
bdd0: 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
bde0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
bdf0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
be00: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
be10: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
be20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
be30: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
be40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
be50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
be60: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
be70: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
be80: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
be90: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
bea0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
beb0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
bec0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
bed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
bee0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
bef0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bf00: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
bf10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bf20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf30: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
bf40: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
bf50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bf60: 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
bf70: 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
bf80: 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
bf90: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
bfa0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
bfb0: 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
bfc0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
bfd0: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29  .  if( zMaster )
bfe0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
bff0: 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
c000: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
c010: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
c020: 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a  urn true,.    **
c030: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
c040: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
c050: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c060: 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
c070: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c080: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
c090: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
c0a0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a  zMaster);.    }.
c0b0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
c0c0: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  Master);.  }..  
c0d0: 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
c0e0: 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
c0f0: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
c100: 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
c110: 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
c120: 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
c130: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
c140: 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 50  th a different P
c150: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
c160: 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
c170: 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
c180: 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
c190: 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
c1a0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74  /.  pPager->sect
c1b0: 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53  orSize = PAGER_S
c1c0: 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 72 65  ECTOR_SIZE;.  re
c1d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c1e0: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
c1f0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c200: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
c210: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
c220: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
c230: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
c240: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
c250: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
c260: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
c270: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
c280: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
c290: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
c2a0: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
c2b0: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
c2c0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
c2d0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
c2e0: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
c2f0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
c300: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
c310: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
c320: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
c330: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
c340: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
c350: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
c360: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
c370: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c380: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
c390: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
c3a0: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
c3b0: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
c3c0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
c3d0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
c3e0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
c3f0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
c400: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
c410: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
c420: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72  nal */.  i64 hdr
c430: 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b  Off;.  int nRec;
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c450: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
c460: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
c490: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
c4a0: 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
c4b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66  >journalOff;.#if
c4c0: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b  ndef NDEBUG .  {
c4d0: 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b  .    i64 os_szJ;
c4e0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c4f0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
c500: 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a  er->jfd, &os_szJ
c510: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
c520: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
c530: 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  n rc;.    assert
c540: 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b  ( szJ==os_szJ );
c550: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
c560: 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20  * Set hdrOff to 
c570: 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  be the offset to
c580: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
c590: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
c5a0: 6e 0a 20 20 2a 2a 20 74 68 69 73 20 73 74 61 74  n.  ** this stat
c5b0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
c5c0: 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
c5d0: 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
c5e0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
c5f0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
c600: 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
c610: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
c620: 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
c630: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
c640: 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
c650: 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
c660: 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
c670: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
c680: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
c690: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
c6a0: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
c6b0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
c6c0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
c6d0: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72  CLUSIVE ){.    r
c6e0: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
c6f0: 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
c700: 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20  r->stmtSize);.  
c710: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
c720: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
c730: 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  tSize;..  /* Fig
c740: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
c750: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
c760: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
c770: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
c780: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
c790: 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
c7a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
c7b0: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  ;.  sqlite3OsSee
c7c0: 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
c7d0: 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61  0);.  nRec = pPa
c7e0: 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
c7f0: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
c800: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
c810: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
c820: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
c830: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
c840: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
c850: 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
c860: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
c870: 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
c880: 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
c890: 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
c8a0: 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
c8b0: 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
c8c0: 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
c8d0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
c8e0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
c8f0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
c900: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
c910: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
c920: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
c930: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61  >stfd, 0);.    a
c940: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
c950: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
c960: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c970: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
c980: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
c990: 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
c9a0: 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
c9b0: 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
c9c0: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
c9d0: 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
c9e0: 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
c9f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ca00: 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
ca10: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
ca20: 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
ca30: 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
ca40: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
ca50: 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
ca60: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
ca70: 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
ca80: 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
ca90: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
caa0: 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
cab0: 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
cac0: 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
cad0: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
cae0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
caf0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
cb00: 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
cb10: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
cb20: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
cb30: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
cb40: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
cb50: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  fd, pPager->stmt
cb60: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
cb70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
cb80: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
cb90: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
cba0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cbb0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
cbc0: 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
cbd0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
cbe0: 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
cbf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 4a 4f 55 52  ;.  assert( JOUR
cc00: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
cc10: 72 29 3c 28 70 50 61 67 65 72 2d 3e 70 61 67 65  r)<(pPager->page
cc20: 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68 69  Size+8) );.  whi
cc30: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
cc40: 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66  nalOff <= (hdrOf
cc50: 66 2d 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f-(pPager->pageS
cc60: 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20 20 72  ize+8)) ){.    r
cc70: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
cc80: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
cc90: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
cca0: 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
ccb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
ccc0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
ccd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
cce0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
ccf0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ck;.  }..  while
cd00: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cd10: 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20  lOff < szJ ){.  
cd20: 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20    u32 nJRec;    
cd30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
cd40: 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
cd50: 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
cd60: 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
cd70: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
cd80: 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c  er, szJ, &nJRec,
cd90: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66   &dummy);.    if
cda0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cdb0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
cdc0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
cdd0: 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   );.      goto e
cde0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
cdf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ce00: 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20  nJRec==0 ){.    
ce10: 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d    nJRec = (szJ -
ce20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ce30: 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
ce40: 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
ce50: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52   }.    for(i=nJR
ce60: 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50  ec-1; i>=0 && pP
ce70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ce80: 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20   < szJ; i--){.  
ce90: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
cea0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
ceb0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
cec0: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  >jfd, 1);.      
ced0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
cee0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
cef0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cf00: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
cf10: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
cf20: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
cf30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
cf40: 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f  zJ;.  .end_stmt_
cf50: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
cf60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b  rc==SQLITE_OK) {
cf70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
cf80: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
cf90: 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f     /* pager_relo
cfa0: 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
cfb0: 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ; */.  }.  retur
cfc0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
cfd0: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
cfe0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
cff0: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
d000: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
d010: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
d020: 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a 65  er_set_cachesize
d030: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
d040: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
d050: 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a  f( mxPage>10 ){.
d060: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
d070: 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  ge = mxPage;.  }
d080: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
d090: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20  ->mxPage = 10;. 
d0a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75   }.}../*.** Adju
d0b0: 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
d0c0: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
d0d0: 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
d0e0: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
d0f0: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
d100: 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
d110: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
d120: 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
d130: 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
d140: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
d150: 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
d160: 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
d170: 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
d180: 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
d190: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
d1a0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
d1c0: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
d1d0: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
d1e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
d1f0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
d200: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
d210: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
d220: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
d230: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
d240: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
d250: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
d260: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
d270: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
d280: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
d290: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
d2a0: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
d2b0: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
d2c0: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
d2d0: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
d2e0: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
d2f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
d300: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
d310: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
d320: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
d330: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
d340: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d350: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
d360: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
d370: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
d380: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
d390: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
d3a0: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
d3b0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d3c0: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
d3d0: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
d3e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
d3f0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
d410: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
d420: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
d430: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
d440: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
d450: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
d460: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
d470: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
d480: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
d490: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
d4a0: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
d4b0: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
d4c0: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
d4d0: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
d4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
d4f0: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
d500: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
d510: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
d520: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
d530: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
d540: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
d550: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
d560: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
d570: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
d580: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
d590: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
d5a0: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
d5b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d5c0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
d5d0: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
d5e0: 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65  _set_safety_leve
d5f0: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
d600: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
d610: 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
d620: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
d630: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
d640: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
d650: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
d660: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
d670: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
d680: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
d690: 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66  l_fsync = full_f
d6a0: 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50 61 67  sync;.  if( pPag
d6b0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
d6c0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
d6d0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
d6e0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d6f0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
d700: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
d710: 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
d720: 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
d730: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
d740: 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
d750: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
d760: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
d770: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
d780: 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
d790: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
d7a0: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
d7b0: 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
d7c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
d7d0: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
d7e0: 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  le.  Write the n
d7f0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
d800: 69 6e 74 6f 20 7a 46 69 6c 65 0a 2a 2a 20 28 7a  into zFile.** (z
d810: 46 69 6c 65 20 6d 75 73 74 20 62 65 20 61 74 20  File must be at 
d820: 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d  least SQLITE_TEM
d830: 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73  PNAME_SIZE bytes
d840: 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a   long.)  Write.*
d850: 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
d860: 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
d870: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
d880: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
d890: 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
d8a0: 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
d8b0: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ail..**.** The O
d8c0: 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
d8d0: 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
d8e0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
d8f0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f  hen it is.** clo
d900: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
d910: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
d920: 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a  opentemp(char *z
d930: 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70  File, OsFile **p
d940: 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  Fd){.  int cnt =
d950: 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69   8;.  int rc;.#i
d960: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
d970: 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
d980: 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
d990: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
d9a0: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
d9b0: 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  nly */.#endif.  
d9c0: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
d9d0: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
d9e0: 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b  FileName(zFile);
d9f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
da00: 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
da10: 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b  (zFile, pFd, 1);
da20: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
da30: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
da40: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
da50: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
da60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
da70: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
da80: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
da90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
daa0: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
dab0: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
dac0: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
dad0: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
dae0: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
daf0: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
db00: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
db10: 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
db20: 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  _get() and is on
db30: 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
db40: 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
db50: 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
db60: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67  using sqlite3pag
db70: 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  er_unref()..**.*
db80: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
db90: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
dba0: 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
dbb0: 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
dbc0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
dbd0: 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
dbe0: 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
dbf0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
dc00: 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
dc10: 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
dc20: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
dc30: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
dc40: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
dc50: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
dc60: 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
dc70: 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
dc80: 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
dc90: 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
dca0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
dcb0: 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
dcc0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
dcd0: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
dce0: 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a  open(.  Pager **
dcf0: 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
dd00: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50   /* Return the P
dd10: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
dd20: 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
dd30: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
dd40: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
dd50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
dd60: 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
dd70: 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
dd80: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
dd90: 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
dda0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
ddb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
dde0: 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
ddf0: 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  /.){.  Pager *pP
de00: 61 67 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  ager = 0;.  char
de10: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
de20: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c  = 0;.  int nameL
de30: 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  en;  /* Compiler
de40: 20 69 73 20 77 72 6f 6e 67 2e 20 54 68 69 73 20   is wrong. This 
de50: 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
de60: 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75 73 65  lized before use
de70: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64   */.  OsFile *fd
de80: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
de90: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
dea0: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
deb0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
dec0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
ded0: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
dee0: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
def0: 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
df00: 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
df10: 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
df20: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
df30: 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
df40: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
df50: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
df60: 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ZE];.#ifdef SQLI
df70: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
df80: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
df90: 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e   A malloc() cann
dfa0: 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74  ot fail in sqlit
dfb0: 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61  e3ThreadData() a
dfc0: 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61  s one or more ca
dfd0: 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c  lls to .  ** mal
dfe0: 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20  loc() must have 
dff0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
e000: 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64  e by this thread
e010: 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a   before it gets.
e020: 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69    ** to this poi
e030: 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  nt. This means t
e040: 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75  he ThreadData mu
e050: 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  st have been all
e060: 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20  ocated already. 
e070: 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65   ** so that Thre
e080: 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61  adData.nAlloc ca
e090: 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75  n be set. It wou
e0a0: 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73  ld be nice to as
e0b0: 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54  sert.  ** that T
e0c0: 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63  hreadData.nAlloc
e0d0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75   is non-zero, bu
e0e0: 74 20 61 6c 61 73 20 74 68 69 73 20 62 72 65 61  t alas this brea
e0f0: 6b 73 20 74 65 73 74 20 63 61 73 65 73 20 0a 20  ks test cases . 
e100: 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69   ** written to i
e110: 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20  nvoke the pager 
e120: 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  directly..  */. 
e130: 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
e140: 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
e150: 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72  dData();.  asser
e160: 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69  t( pTsd );.#endi
e170: 66 0a 0a 20 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f  f..  /* If mallo
e180: 63 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20  c() has already 
e190: 66 61 69 6c 65 64 20 72 65 74 75 72 6e 20 53 51  failed return SQ
e1a0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f  LITE_NOMEM. Befo
e1b0: 72 65 20 65 76 65 6e 0a 20 20 2a 2a 20 74 65 73  re even.  ** tes
e1c0: 74 69 6e 67 20 66 6f 72 20 74 68 69 73 2c 20 73  ting for this, s
e1d0: 65 74 20 2a 70 70 50 61 67 65 72 20 74 6f 20 4e  et *ppPager to N
e1e0: 55 4c 4c 20 73 6f 20 74 68 65 20 63 61 6c 6c 65  ULL so the calle
e1f0: 72 20 6b 6e 6f 77 73 20 74 68 65 20 70 61 67 65  r knows the page
e200: 72 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  r.  ** structure
e210: 20 77 61 73 20 6e 65 76 65 72 20 61 6c 6c 6f 63   was never alloc
e220: 61 74 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70  ated. .  */.  *p
e230: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66  pPager = 0;.  if
e240: 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
e250: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72  ailed() ){.    r
e260: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e270: 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  EM;.  }.  memset
e280: 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&fd, 0, sizeof(
e290: 66 64 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  fd));..  /* Open
e2a0: 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
e2b0: 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74  and set zFullPat
e2c0: 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61  hname to point a
e2d0: 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20  t malloc()ed .  
e2e0: 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69  ** memory contai
e2f0: 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74  ning the complet
e300: 65 20 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e  e filename (i.e.
e310: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64   including the d
e320: 69 72 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a  irectory)..  */.
e330: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
e340: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
e350: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
e360: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
e370: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
e380: 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
e390: 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
e3a0: 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
e3b0: 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20    zFullPathname 
e3c0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 22  = sqliteStrDup("
e3d0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  ");.    }else.#e
e3e0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
e3f0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   zFullPathname =
e400: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
e410: 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  thname(zFilename
e420: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75  );.      if( zFu
e430: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
e440: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e450: 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
e460: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  e(zFullPathname,
e470: 20 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29   &fd, &readOnly)
e480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e490: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
e4a0: 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  = sqlite3pager_o
e4b0: 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26  pentemp(zTemp, &
e4c0: 66 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  fd);.    zFilena
e4d0: 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  me = zTemp;.    
e4e0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e4f0: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
e500: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
e510: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
e520: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e530: 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
e540: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
e550: 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
e560: 72 20 73 74 72 75 63 74 75 72 65 2e 20 41 73 20  r structure. As 
e570: 70 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65  part of the same
e580: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c   allocation, all
e590: 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65  ocate.  ** space
e5a0: 20 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61   for the full pa
e5b0: 74 68 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c  ths of the file,
e5c0: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a   directory and j
e5d0: 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61  ournal .  ** (Pa
e5e0: 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50  ger.zFilename, P
e5f0: 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20  ager.zDirectory 
e600: 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
e610: 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  al)..  */.  if( 
e620: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
e630: 0a 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73  .    nameLen = s
e640: 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e  trlen(zFullPathn
e650: 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ame);.    pPager
e660: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
e670: 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
e680: 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33   + nameLen*3 + 3
e690: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  0 );.  }..  /* I
e6a0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
e6b0: 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
e6c0: 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
e6d0: 2c 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72  , free the memor
e6e0: 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20  y .  ** pointed 
e6f0: 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e  to by zFullPathn
e700: 61 6d 65 2c 20 66 72 65 65 20 74 68 65 20 50 61  ame, free the Pa
e710: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
e720: 64 20 63 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a  d close the .  *
e730: 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 74 68  * file. Since th
e740: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61  e pager is not a
e750: 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69  llocated there i
e760: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74  s no need to set
e770: 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72   .  ** any Pager
e780: 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  .errMask variabl
e790: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
e7a0: 70 50 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c  pPager || !zFull
e7b0: 50 61 74 68 6e 61 6d 65 20 7c 7c 20 72 63 21 3d  Pathname || rc!=
e7c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e7d0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
e7e0: 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &fd);.    sqlite
e7f0: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
e800: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  me);.    sqliteF
e810: 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
e820: 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51   return ((rc==SQ
e830: 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f  LITE_OK)?SQLITE_
e840: 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a  NOMEM:rc);.  }..
e850: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25    TRACE3("OPEN %
e860: 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
e870: 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c  DLEID(fd), zFull
e880: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Pathname);.  pPa
e890: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
e8a0: 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b   (char*)&pPager[
e8b0: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  1];.  pPager->zD
e8c0: 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
e8d0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61  er->zFilename[na
e8e0: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67  meLen+1];.  pPag
e8f0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
e900: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e910: 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  ry[nameLen+1];. 
e920: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
e930: 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c  zFilename, zFull
e940: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
e950: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
e960: 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74  ectory, zFullPat
e970: 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69  hname);..  for(i
e980: 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26  =nameLen; i>0 &&
e990: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
e9a0: 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69  ory[i-1]!='/'; i
e9b0: 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20  --){}.  if( i>0 
e9c0: 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  ) pPager->zDirec
e9d0: 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20  tory[i-1] = 0;. 
e9e0: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
e9f0: 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50  zJournal, zFullP
ea00: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  athname);.  sqli
ea10: 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  teFree(zFullPath
ea20: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
ea30: 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
ea40: 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f  l[nameLen], "-jo
ea50: 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65  urnal");.  pPage
ea60: 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a  r->fd = fd;.  /*
ea70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ea80: 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Open = 0; */.  p
ea90: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
eaa0: 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26  l = useJournal &
eab0: 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  & !memDb;.  pPag
eac0: 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
ead0: 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72   noReadlock && r
eae0: 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
eaf0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
eb00: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
eb10: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
eb20: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
eb30: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
eb40: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
eb50: 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
eb60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
eb70: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
eb80: 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20  PAGE_SIZE;.  /* 
eb90: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
eba0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
ebb0: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
ebc0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
ebd0: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
ebe0: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
ebf0: 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f  nMaxPage = 0; */
ec00: 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
ec10: 65 20 3d 20 31 30 30 3b 0a 20 20 61 73 73 65 72  e = 100;.  asser
ec20: 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d  t( PAGER_UNLOCK=
ec30: 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  =0 );.  /* pPage
ec40: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
ec50: 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a  _UNLOCK; */.  /*
ec60: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
ec70: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
ec80: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
ec90: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
eca0: 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b  ->memDb = memDb;
ecb0: 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
ecc0: 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
ecd0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65    /* pPager->nee
ece0: 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20  dSync = 0; */.  
ecf0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
ed00: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
ed10: 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
ed20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
ed30: 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
ed40: 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f  noSync?0:1);.  /
ed50: 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
ed60: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
ed70: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
ed80: 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
ed90: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
eda0: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
edb0: 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
edc0: 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
edd0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74  ;.  pPager->sect
ede0: 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53  orSize = PAGER_S
edf0: 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a  ECTOR_SIZE;.  /*
ee00: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
ee10: 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
ee20: 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
ee30: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
ee40: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
ee50: 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
ee60: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64  r = pPager;.#ifd
ee70: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ee80: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
ee90: 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  NT.  pPager->pNe
eea0: 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  xt = pTsd->pPage
eeb0: 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65  r;.  pTsd->pPage
eec0: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64  r = pPager;.#end
eed0: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
eee0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
eef0: 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
ef00: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
ef10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
ef20: 67 65 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64  ger_set_busyhand
ef30: 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ler(Pager *pPage
ef40: 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r, BusyHandler *
ef50: 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20  pBusyHandler){. 
ef60: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
ef70: 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e  ndler = pBusyHan
ef80: 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  dler;.}../*.** S
ef90: 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  et the destructo
efa0: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
efb0: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
efc0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
efd0: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e  s called.** when
efe0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
eff0: 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67  ount on each pag
f000: 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  e reaches zero. 
f010: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
f020: 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  can.** be used t
f030: 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72  o clean up infor
f040: 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78  mation in the ex
f050: 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65  tra segment appe
f060: 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67  nded to each pag
f070: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73  e..**.** The des
f080: 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63  tructor is not c
f090: 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c  alled as a resul
f0a0: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
f0b0: 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
f0c0: 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
f0d0: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
f0e0: 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
f0f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f100: 33 70 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72  3pager_set_destr
f110: 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
f120: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
f130: 63 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  c)(void*,int)){.
f140: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
f150: 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d  uctor = xDesc;.}
f160: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f170: 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  reinitializer fo
f180: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
f190: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
f1a0: 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
f1b0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
f1c0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
f1d0: 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
f1e0: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
f1f0: 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61  s original.** va
f200: 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  lue as a result 
f210: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  of a rollback.  
f220: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76  The callback giv
f230: 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  es higher-level 
f240: 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72  code.** an oppor
f250: 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72  tunity to restor
f260: 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74  e the EXTRA sect
f270: 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74  ion to agree wit
f280: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a  h the restored.*
f290: 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  * page data..*/.
f2a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
f2b0: 72 5f 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50  r_set_reiniter(P
f2c0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
f2d0: 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f  id (*xReinit)(vo
f2e0: 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  id*,int)){.  pPa
f2f0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
f300: 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a   xReinit;.}../*.
f310: 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20  ** Set the page 
f320: 73 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68  size.  Return th
f330: 65 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20  e new size.  If 
f340: 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20  the suggest new 
f350: 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20  page.** size is 
f360: 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74  inappropriate, t
f370: 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  hen an alternati
f380: 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ve page size is 
f390: 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20  selected.** and 
f3a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
f3b0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
f3c0: 74 5f 70 61 67 65 73 69 7a 65 28 50 61 67 65 72  t_pagesize(Pager
f3d0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61   *pPager, int pa
f3e0: 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  geSize){.  asser
f3f0: 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t( pageSize>=512
f400: 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
f410: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
f420: 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ZE );.  if( !pPa
f430: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
f440: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
f450: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
f460: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
f470: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  er->pageSize;.}.
f480: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
f490: 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
f4a0: 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
f4b0: 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
f4c0: 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
f4d0: 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
f4e0: 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
f4f0: 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
f500: 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
f510: 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
f520: 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
f530: 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
f540: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
f550: 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
f560: 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
f570: 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
f580: 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
f590: 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
f5a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
f5b0: 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
f5c0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
f5d0: 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
f5e0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
f5f0: 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
f600: 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
f610: 0a 76 6f 69 64 20 63 6c 65 61 72 5f 73 69 6d 75  .void clear_simu
f620: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29  lated_io_error()
f630: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
f640: 72 72 6f 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a  rror_hit = 0;.}.
f650: 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
f660: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
f670: 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
f680: 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
f690: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
f6a0: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
f6b0: 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
f6c0: 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
f6d0: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
f6e0: 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
f6f0: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
f700: 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
f710: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
f720: 6e 65 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74  ne clear_simulat
f730: 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 0a 23 20  ed_io_error().# 
f740: 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
f750: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
f760: 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
f770: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
f780: 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
f790: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
f7a0: 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
f7b0: 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
f7c0: 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
f7d0: 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
f7e0: 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
f7f0: 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72  to. .**.** No er
f800: 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20  ror checking is 
f810: 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e  done. The ration
f820: 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  al for this is t
f830: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
f840: 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c  n .** may be cal
f850: 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20  led even if the 
f860: 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
f870: 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61  ist or contain a
f880: 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20   header. In .** 
f890: 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69  these cases sqli
f8a0: 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c  te3OsRead() will
f8b0: 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
f8c0: 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  , to which the c
f8d0: 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f  orrect .** respo
f8e0: 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74  nse is to zero t
f8f0: 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65  he memory at pDe
f900: 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e  st and continue.
f910: 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f    A real IO erro
f920: 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75  r .** will presu
f930: 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20  mably recur and 
f940: 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74  be picked up lat
f950: 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20  er (Todo: Think 
f960: 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a  about this)..*/.
f970: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
f980: 72 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65  r_read_fileheade
f990: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
f9a0: 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
f9b0: 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
f9c0: 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
f9d0: 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  , N);.  if( MEMD
f9e0: 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61  B==0 ){.    disa
f9f0: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
fa00: 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
fa10: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
fa20: 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
fa30: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
fa40: 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
fa50: 2c 20 4e 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  , N);.    enable
fa60: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
fa70: 72 6f 72 73 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rors();.  }.}../
fa80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
fa90: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
faa0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
fab0: 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
fac0: 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
fad0: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
fae0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65  PENDING_BYTE lie
faf0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69  s on the page di
fb00: 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
fb10: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66   end of the.** f
fb20: 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  ile, then consid
fb30: 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72  er this page par
fb40: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  t of the file to
fb50: 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  o. For example, 
fb60: 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59  if.** PENDING_BY
fb70: 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20  TE is byte 4096 
fb80: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
fb90: 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74  of page 5) and t
fba0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
fbb0: 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62  * file is 4096 b
fbc0: 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72  ytes, 5 is retur
fbd0: 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34  ned instead of 4
fbe0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fbf0: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
fc00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
fc10: 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72    i64 n;.  int r
fc20: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
fc30: 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
fc40: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
fc50: 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61  0 ){.    n = pPa
fc60: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
fc70: 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 28 20   else {.    if( 
fc80: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
fc90: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
fca0: 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45  fd, &n))!=SQLITE
fcb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
fcc0: 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
fcd0: 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75   rc);.      retu
fce0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
fcf0: 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
fd00: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
fd10: 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  .      n = 1;.  
fd20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
fd30: 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
fd40: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
fd50: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
fd60: 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
fd70: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
fd80: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20  >dbSize = n;.   
fd90: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
fda0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  (PENDING_BYTE/pP
fdb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
fdc0: 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
fdd0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
fde0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fdf0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
fe00: 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
fe10: 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
fe20: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
fe30: 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
fe40: 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
fe50: 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  teFree(pHist->pO
fe60: 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  rig);.  sqliteFr
fe70: 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
fe80: 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
fe90: 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
fea0: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73  Stmt = 0;.}.#els
feb0: 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48  e.#define clearH
fec0: 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66  istory(x).#endif
fed0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
fee0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
fef0: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
ff00: 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
ff10: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  /*.** Unlink pPg
ff20: 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20   from it's hash 
ff30: 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20  chain. Also set 
ff40: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
ff50: 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65  to 0 to indicate
ff60: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
ff70: 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  e is not part of
ff80: 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e   any hash chain.
ff90: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
ffa0: 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  d because the.**
ffb0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f   sqlite3pager_mo
ffc0: 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
ffd0: 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
ffe0: 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
fff0: 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
10000 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
10010 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
10020 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
10030 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
10040 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
10050 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
10060 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
10070 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
10080 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
10090 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
100a0 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
100b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
100c0 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
100d0 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
100e0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
100f0 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
10100 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
10110 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
10120 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
10130 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
10140 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
10150 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
10160 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
10170 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
10180 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
10190 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
101a0 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
101b0 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
101c0 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
101d0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
101e0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
101f0 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
10200 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
10210 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
10220 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
10230 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
10240 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
10250 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
10260 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
10270 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
10280 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
10290 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
102a0 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
102b0 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
102c0 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
102d0 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
102e0 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
102f0 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
10300 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
10310 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
10320 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
10330 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73  * Keep the pFirs
10340 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20  tSynced pointer 
10350 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
10360 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a  first synchroniz
10370 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  ed page */.  if(
10380 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46   pPg==pPager->pF
10390 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
103a0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
103b0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
103c0 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
103d0 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
103e0 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
103f0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
10400 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
10410 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  }..  /* Unlink f
10420 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
10430 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70   */.  if( pPg->p
10440 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
10450 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
10460 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
10470 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65  >pNextFree;.  }e
10480 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
10490 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
104a0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
104b0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
104c0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
104d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
104e0 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  tFree ){.    pPg
104f0 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
10500 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
10510 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  revFree;.  }else
10520 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
10530 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
10540 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
10550 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
10560 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50  evFree;.  }.  pP
10570 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  g->pNextFree = p
10580 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
10590 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  0;..  /* Unlink 
105a0 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
105b0 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
105c0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
105d0 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23  ager, pPg);.}..#
105e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
105f0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
10600 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
10610 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61  s used to trunca
10620 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
10630 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74  database.  Delet
10640 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77  e.** all pages w
10650 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  hose pgno is lar
10660 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
10670 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
10680 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20  nreferenced..** 
10690 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
106a0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
106b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
106c0 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  zeroed..*/.stati
106d0 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75  c void memoryTru
106e0 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
106f0 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
10700 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
10710 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
10720 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
10730 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
10740 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
10750 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
10760 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
10770 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
10780 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
10790 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
107a0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
107b0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
107c0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
107d0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
107e0 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
107f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
10800 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
10810 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
10820 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
10830 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
10840 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
10850 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  );.      makeCle
10860 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  an(pPg);.      s
10870 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
10880 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
10890 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
108a0 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
108b0 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
108c0 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  p).#endif../*.**
108d0 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
108e0 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e   lock on a file.
108f0 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73    Invoke the bus
10900 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
10910 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72  e lock.** is cur
10920 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
10930 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e  able.  Repeat un
10940 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
10950 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a  lback returns.**
10960 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
10970 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
10980 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
10990 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
109a0 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
109b0 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
109c0 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
109d0 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
109e0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
109f0 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
10a00 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
10a10 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
10a20 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
10a30 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
10a40 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
10a50 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
10a60 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
10a70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
10a80 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
10a90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
10aa0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10ab0 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
10ac0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10ad0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
10ae0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
10af0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
10b00 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
10b10 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
10b20 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
10b30 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76  SY && sqlite3Inv
10b40 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
10b50 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
10b60 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ler) );.    if( 
10b70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10b80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
10b90 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  tate = locktype;
10ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10bb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10bc0 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
10bd0 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
10be0 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
10bf0 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
10c00 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
10c10 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
10c20 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
10c30 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
10c40 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
10c50 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
10c60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
10c70 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
10c80 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
10c90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10ca0 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
10cb0 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
10cc0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
10cd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10ce0 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
10cf0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
10d00 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
10d10 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
10d20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
10d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10d40 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a    }.  rc = syncJ
10d50 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
10d60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10d70 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
10d80 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
10d90 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  Get an exclusive
10da0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
10db0 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75  abase before tru
10dc0 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63  ncating. */.  rc
10dd0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
10de0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
10df0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
10e00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10e10 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
10e20 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d   rc;.  }..  rc =
10e30 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
10e40 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
10e50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10e60 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
10e70 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
10e80 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
10e90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
10ea0 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
10eb0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
10ec0 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
10ed0 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
10ee0 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
10ef0 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
10f00 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
10f10 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
10f20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
10f30 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
10f40 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
10f50 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
10f60 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
10f70 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
10f80 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
10f90 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
10fa0 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
10fb0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
10fc0 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
10fd0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
10fe0 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
10ff0 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
11000 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
11010 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
11020 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
11030 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
11040 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
11050 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
11060 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
11070 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11080 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
11090 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
110a0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
110b0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
110c0 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
110d0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
110e0 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
110f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
11100 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72  ager_close(Pager
11110 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
11120 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
11130 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11140 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
11150 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
11160 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
11170 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
11180 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
11190 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
111a0 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
111b0 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
111c0 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
111d0 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
111e0 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
111f0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
11200 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
11210 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
11220 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
11230 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
11240 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
11250 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
11260 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72   set..  */.  Thr
11270 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
11280 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
11290 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
112a0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
112b0 74 28 20 70 54 73 64 20 26 26 20 70 54 73 64 2d  t( pTsd && pTsd-
112c0 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69  >nAlloc );.#endi
112d0 66 0a 0a 20 20 73 77 69 74 63 68 28 20 70 50 61  f..  switch( pPa
112e0 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20  ger->state ){.  
112f0 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53    case PAGER_RES
11300 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20  ERVED:.    case 
11310 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20  PAGER_SYNCED: . 
11320 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58     case PAGER_EX
11330 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20  CLUSIVE: {.     
11340 20 2f 2a 20 57 65 20 69 67 6e 6f 72 65 20 61 6e   /* We ignore an
11350 79 20 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74  y IO errors that
11360 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20 74 68   occur during th
11370 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20  e rollback.     
11380 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
11390 6f 20 64 69 73 61 62 6c 65 20 49 4f 20 65 72 72  o disable IO err
113a0 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f  or simulation so
113b0 20 74 68 61 74 20 74 65 73 74 69 6e 67 0a 20 20   that testing.  
113c0 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72      ** works mor
113d0 65 20 65 61 73 69 6c 79 2e 0a 20 20 20 20 20 20  e easily..      
113e0 2a 2f 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  */.      disable
113f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
11400 72 6f 72 73 28 29 3b 0a 20 20 20 20 20 20 73 71  rors();.      sq
11410 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
11420 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11430 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
11440 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
11450 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44  .      if( !MEMD
11460 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  B ){.        sql
11470 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
11480 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
11490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
114a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
114b0 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
114c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
114d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  =0 );.      brea
114e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
114f0 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20  e PAGER_SHARED: 
11500 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d  {.      if( !MEM
11510 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  DB ){.        sq
11520 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
11530 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
11540 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
11550 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11560 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
11570 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
11580 67 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  g */.      break
11590 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
115a0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
115b0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
115c0 78 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  xt){.#ifndef NDE
115d0 42 55 47 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  BUG.    if( MEMD
115e0 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  B ){.      PgHis
115f0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
11600 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
11610 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
11620 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c  assert( !pPg->al
11630 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
11640 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
11650 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  Hist->pOrig );. 
11660 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
11670 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  ist->pStmt );.  
11680 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
11690 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
116a0 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
116b0 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
116c0 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25   TRACE2("CLOSE %
116d0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
116e0 61 67 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ager));.  assert
116f0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
11700 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  e || (pPager->jo
11710 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20  urnalOpen==0 && 
11720 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
11730 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  ==0) );.  if( pP
11740 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
11750 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
11760 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
11770 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
11780 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
11790 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  aInJournal);.  i
117a0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
117b0 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
117c0 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
117d0 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
117e0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
117f0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
11800 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
11810 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
11820 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
11830 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
11840 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
11850 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
11860 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
11870 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
11880 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c    */..#ifdef SQL
11890 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
118a0 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
118b0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
118c0 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b  er from the link
118d0 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
118e0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20  s starting at . 
118f0 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70   ** ThreadData.p
11900 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d  Pager if memory-
11910 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
11920 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  abled..  */.  if
11930 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e  ( pPager==pTsd->
11940 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54  pPager ){.    pT
11950 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  sd->pPager = pPa
11960 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  ger->pNext;.  }e
11970 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  lse{.    Pager *
11980 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54  pTmp;.    for(pT
11990 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  mp = pTsd->pPage
119a0 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d  r; pTmp->pNext!=
119b0 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d  pPager; pTmp=pTm
119c0 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20  p->pNext){}.    
119d0 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50  pTmp->pNext = pP
119e0 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  ager->pNext;.  }
119f0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
11a00 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
11a10 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  sh);.  sqliteFre
11a20 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
11a30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11a40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11a50 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
11a60 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
11a70 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
11a80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
11a90 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
11aa0 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
11ab0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
11ac0 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
11ad0 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
11ae0 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
11af0 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
11b00 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
11b10 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
11b20 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
11b30 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
11b40 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
11b50 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
11b60 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
11b70 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
11b80 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
11b90 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
11ba0 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
11bb0 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
11bc0 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
11bd0 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
11be0 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
11bf0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
11c00 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
11c10 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
11c20 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
11c30 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
11c40 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
11c50 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
11c60 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
11c70 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
11c80 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
11c90 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
11ca0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
11cb0 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
11cc0 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
11cd0 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
11ce0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
11cf0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
11d00 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
11d10 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
11d20 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
11d30 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
11d40 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
11d50 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
11d60 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
11d70 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
11d80 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
11d90 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
11da0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
11db0 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
11dc0 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
11dd0 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
11de0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
11df0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
11e00 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
11e10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11e20 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
11e30 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
11e40 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
11e50 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
11e60 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
11e70 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
11e80 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
11e90 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
11ea0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
11eb0 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
11ec0 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
11ed0 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
11ee0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11ef0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
11f00 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
11f10 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
11f20 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
11f30 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
11f40 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11f50 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
11f60 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70  .      REFINFO(p
11f70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Pg);.    }.  }.#
11f80 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
11f90 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
11fa0 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
11fb0 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
11fc0 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
11fd0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
11fe0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
11ff0 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
12000 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
12010 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
12020 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
12030 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
12040 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
12050 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
12060 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
12070 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
12080 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  a);.  page_ref(p
12090 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
120a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
120b0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
120c0 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
120d0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
120e0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
120f0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
12100 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
12110 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
12120 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
12130 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
12140 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
12150 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
12160 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
12170 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
12180 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
12190 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
121a0 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
121b0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
121c0 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
121d0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
121e0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
121f0 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
12200 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
12210 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
12220 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
12230 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
12240 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
12250 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
12260 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
12270 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
12280 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
12290 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
122a0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
122b0 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
122c0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
122d0 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
122e0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
122f0 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
12300 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
12310 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
12320 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
12330 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
12340 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
12350 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
12360 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
12370 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
12380 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
12390 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
123a0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
123b0 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
123c0 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
123d0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
123e0 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
123f0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
12400 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
12410 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
12420 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
12430 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
12440 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
12450 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
12460 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
12470 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
12480 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
12490 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
124a0 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
124b0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
124c0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
124d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
124e0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
124f0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
12500 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
12510 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
12520 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
12530 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
12540 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
12550 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
12560 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12570 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
12580 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
12590 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
125a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
125b0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
125c0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
125d0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
125e0 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
125f0 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
12600 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
12610 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
12620 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
12630 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
12640 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
12650 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
12660 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
12670 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
12680 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
12690 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
126a0 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
126b0 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
126c0 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
126d0 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
126e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
126f0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
12700 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
12710 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12720 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
12730 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
12740 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
12750 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
12760 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
12770 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
12780 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20  alOff==jSz );.  
12790 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
127a0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
127b0 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
127c0 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
127d0 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
127e0 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
127f0 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
12800 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
12810 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
12820 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
12830 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
12840 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
12850 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
12860 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
12870 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
12880 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
12890 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
128a0 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20   rollback. .    
128b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
128c0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
128d0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
128e0 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
128f0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
12900 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
12910 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
12920 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
12930 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
12940 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
12950 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
12960 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12970 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12980 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
12990 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
129a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
129b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
129c0 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
129d0 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
129e0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
129f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72  rn rc;.        r
12a00 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
12a10 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
12a20 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20  ger->nRec);.    
12a30 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
12a40 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  urn rc;..       
12a50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
12a60 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
12a70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12a80 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
12a90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12ab0 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
12ac0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
12ad0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
12ae0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12af0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
12b00 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  ->jfd, pPager->f
12b10 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20  ull_fsync);.    
12b20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
12b30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
12b40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
12b50 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
12b60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
12b70 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
12b80 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
12b90 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
12ba0 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
12bb0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
12bc0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
12bd0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
12be0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
12bf0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
12c00 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
12c10 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
12c20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
12c30 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
12c40 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
12c50 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
12c60 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65  lag is clear the
12c70 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  n the PgHdr.need
12c80 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d  Sync.  ** flag m
12c90 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61  ust also be clea
12ca0 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e  r for all pages.
12cb0 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
12cc0 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e  is.  ** invarian
12cd0 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a  t is true..  */.
12ce0 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28    else{.    for(
12cf0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
12d00 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
12d10 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
12d20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
12d30 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
12d40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
12d50 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12d60 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  ced==pPager->pFi
12d70 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
12d80 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
12d90 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74  }../*.** Merge t
12da0 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65  wo lists of page
12db0 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70  s connected by p
12dc0 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e  Dirty and in pgn
12dd0 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e  o order..** Do n
12de0 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74  ot both fixing t
12df0 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
12e00 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
12e10 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70  c PgHdr *merge_p
12e20 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
12e30 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20  A, PgHdr *pB){. 
12e40 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a   PgHdr result, *
12e50 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d  pTail;.  pTail =
12e60 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c   &result;.  whil
12e70 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20  e( pA && pB ){. 
12e80 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c     if( pA->pgno<
12e90 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  pB->pgno ){.    
12ea0 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
12eb0 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69  = pA;.      pTai
12ec0 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41  l = pA;.      pA
12ed0 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20   = pA->pDirty;. 
12ee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12ef0 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
12f00 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pB;.      pTail 
12f10 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d  = pB;.      pB =
12f20 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pB->pDirty;.   
12f30 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20   }.  }.  if( pA 
12f40 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  ){.    pTail->pD
12f50 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c  irty = pA;.  }el
12f60 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20  se if( pB ){.   
12f70 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
12f80 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   pB;.  }else{.  
12f90 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
12fa0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
12fb0 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b  n result.pDirty;
12fc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74  .}../*.** Sort t
12fd0 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
12fe0 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
12ff0 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61  der by pgno.  Pa
13000 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65  ges are.** conne
13010 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 70  cted by pDirty p
13020 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50  ointers.  The pP
13030 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
13040 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74  s are.** corrupt
13050 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e  ed by this sort.
13060 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f  .*/.#define N_SO
13070 52 54 5f 42 55 43 4b 45 54 20 32 35 0a 73 74 61  RT_BUCKET 25.sta
13080 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f  tic PgHdr *sort_
13090 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
130a0 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61  pIn){.  PgHdr *a
130b0 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5d 2c  [N_SORT_BUCKET],
130c0 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
130d0 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a  memset(a, 0, siz
130e0 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65  eof(a));.  while
130f0 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d  ( pIn ){.    p =
13100 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20   pIn;.    pIn = 
13110 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70  p->pDirty;.    p
13120 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
13130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53    for(i=0; i<N_S
13140 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b  ORT_BUCKET-1; i+
13150 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  +){.      if( a[
13160 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  i]==0 ){.       
13170 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20   a[i] = p;.     
13180 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
131a0 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
131b0 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20  t(a[i], p);.    
131c0 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20      a[i] = 0;.  
131d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
131e0 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55  if( i==N_SORT_BU
131f0 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20  CKET-1 ){.      
13200 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67  a[i] = merge_pag
13210 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a  elist(a[i], p);.
13220 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20      }.  }.  p = 
13230 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  a[0];.  for(i=1;
13240 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54   i<N_SORT_BUCKET
13250 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
13260 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70  merge_pagelist(p
13270 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  , a[i]);.  }.  r
13280 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
13290 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
132a0 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
132b0 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
132c0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
132d0 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
132e0 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
132f0 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
13300 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
13310 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
13320 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
13330 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
13340 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
13350 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
13360 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
13370 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
13380 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
13390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
133a0 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
133b0 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
133c0 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
133d0 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
133e0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
133f0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
13400 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
13410 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
13420 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
13430 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
13440 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
13450 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
13460 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
13470 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
13480 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
13490 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
134a0 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
134b0 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
134c0 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
134d0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
134e0 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
134f0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
13500 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
13510 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
13520 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
13530 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
13540 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
13550 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
13560 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
13570 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
13580 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
13590 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
135a0 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
135b0 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
135c0 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
135d0 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
135e0 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
135f0 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
13600 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
13610 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
13620 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
13630 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
13640 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
13650 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
13660 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
13670 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
13680 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
13690 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
136a0 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
136b0 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
136c0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
136d0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
136e0 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
136f0 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
13700 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
13710 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
13720 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
13730 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
13740 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
13750 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
13760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13770 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
13780 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d  ;.  }..  pList =
13790 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70   sort_pagelist(p
137a0 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  List);.  while( 
137b0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
137c0 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
137d0 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  y );.    rc = sq
137e0 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
137f0 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e  er->fd, (pList->
13800 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
13810 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
13820 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
13830 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49  urn rc;.    /* I
13840 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
13850 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
13860 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
13870 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
13880 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
13890 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
138a0 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
138b0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
138c0 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20   was called to. 
138d0 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66     ** make the f
138e0 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65  ile smaller (pre
138f0 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d  sumably by auto-
13900 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f  vacuum code). Do
13910 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a   not write.    *
13920 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73  * any such pages
13930 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   to the file..  
13940 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69    */.    if( pLi
13950 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  st->pgno<=pPager
13960 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
13970 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20    char *pData = 
13980 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 50  CODEC2(pPager, P
13990 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
139a0 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  st), pList->pgno
139b0 2c 20 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43  , 6);.      TRAC
139c0 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E3("STORE %d pag
139d0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
139e0 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d  (pPager), pList-
139f0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  >pgno);.      rc
13a00 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
13a10 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
13a20 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
13a30 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 54 45  eSize);.      TE
13a40 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
13a50 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23  nWrite);.    }.#
13a60 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
13a70 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52    else{.      TR
13a80 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
13a90 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
13aa0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
13ab0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
13ac0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
13ad0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13ae0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74  .    pList->dirt
13af0 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
13b00 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13b10 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
13b20 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
13b30 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
13b40 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
13b50 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
13b60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
13b70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13b80 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64   Collect every d
13b90 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61  irty page into a
13ba0 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a   dirty list and.
13bb0 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** return a poin
13bc0 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
13bd0 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41  of that list.  A
13be0 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ll pages are.** 
13bf0 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69  collected even i
13c00 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c  f they are still
13c10 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
13c20 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
13c30 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
13c40 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ges(Pager *pPage
13c50 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
13c60 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a  ger->pDirty;.}..
13c70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
13c80 45 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  E if there is a 
13c90 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  hot journal on t
13ca0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
13cb0 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** A hot journal
13cc0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65   is one that nee
13cd0 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
13ce0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
13cf0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
13d00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
13d10 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
13d20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
13d30 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
13d40 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
13d50 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
13d60 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
13d70 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
13d80 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
13d90 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20  Just delete the 
13da0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
13db0 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
13dc0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
13dd0 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
13de0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
13df0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
13e00 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45   !sqlite3OsFileE
13e10 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
13e20 6f 75 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e  ournal) ) return
13e30 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
13e40 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
13e50 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29  Lock(pPager->fd)
13e60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
13e70 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  f( sqlite3pager_
13e80 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
13e90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
13ea0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
13eb0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
13ec0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
13ed0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
13ee0 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
13ef0 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70   Try to find a p
13f00 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
13f10 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 63   that can be rec
13f20 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ycled. .**.** Th
13f30 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  is routine may r
13f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
13f50 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  RR, SQLITE_FULL 
13f60 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74  or SQLITE_OK. It
13f70 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65   .** does not se
13f80 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72  t the pPager->er
13f90 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
13fa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13fb0 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65  ger_recycle(Page
13fc0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73  r *pPager, int s
13fd0 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70  yncOk, PgHdr **p
13fe0 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  pPg){.  PgHdr *p
13ff0 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b  Pg;.  *ppPg = 0;
14000 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61  ..  /* Find a pa
14010 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
14020 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
14030 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
14040 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20  ot.  ** require 
14050 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
14060 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
14070 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  al..  */.  pPg =
14080 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
14090 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  ynced;..  /* If 
140a0 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  we could not fin
140b0 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  d a page that do
140c0 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
140d0 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f  n fsync().  ** o
140e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
140f0 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68  le then fsync th
14100 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
14110 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20   This is a.  ** 
14120 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74  very slow operat
14130 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20  ion, so we work 
14140 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74  hard to avoid it
14150 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73  .  But sometimes
14160 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62  .  ** it can't b
14170 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20  e helped..  */. 
14180 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70   if( pPg==0 && p
14190 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26  Pager->pFirst &&
141a0 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44   syncOk && !MEMD
141b0 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  B){.    int rc =
141c0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
141d0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
141e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
141f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
14200 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
14210 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
14220 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
14230 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61  nc mode, write a
14240 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61   new journal hea
14250 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  der into the.   
14260 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
14270 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  le. This is done
14280 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d   to avoid ever m
14290 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e  odifying a journ
142a0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64  al.      ** head
142b0 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c  er that is invol
142c0 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  ved in the rollb
142d0 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61  ack of pages tha
142e0 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  t have.      ** 
142f0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
14300 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
14310 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74 68  base (in case th
14320 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20 20  e header is.    
14330 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65    ** trashed whe
14340 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
14350 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20   is updated)..  
14360 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
14370 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
14380 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14390 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
143a0 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  > 0 );.      rc 
143b0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
143c0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
143d0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
143e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
143f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14400 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
14410 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69  >pFirst;.  }.  i
14420 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
14430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14440 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  K;.  }..  assert
14450 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
14460 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
14470 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61  e page to the da
14480 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
14490 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f  t is dirty..  */
144a0 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
144b0 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  y ){.    int rc;
144c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
144d0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
144e0 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
144f0 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  Pg);.    pPg->di
14500 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  rty = 1;.    pPg
14510 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
14520 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
14530 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
14540 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
14550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14560 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14570 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
14580 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
14590 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
145a0 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
145b0 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
145c0 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
145d0 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74  k, then.  ** set
145e0 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
145f0 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
14600 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
14610 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
14620 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
14630 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
14640 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
14650 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
14660 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
14670 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
14680 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
14690 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
146a0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
146b0 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
146c0 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
146d0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
146e0 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
146f0 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
14700 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
14710 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
14720 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
14730 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
14740 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
14750 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
14760 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
14770 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
14780 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
14790 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
147a0 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
147b0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74  }..  /* Unlink t
147c0 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d  he old page from
147d0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61   the free list a
147e0 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nd the hash tabl
147f0 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50  e.  */.  unlinkP
14800 61 67 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54  age(pPg);.  TEST
14810 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f  _INCR(pPager->nO
14820 76 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d  vfl);..  *ppPg =
14830 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
14840 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14850 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
14860 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72   is called to fr
14870 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64  ee superfluous d
14880 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
14890 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68  ated memory.** h
148a0 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72  eld by the pager
148b0 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20   system. Memory 
148c0 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51  in use by any SQ
148d0 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63  Lite pager alloc
148e0 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
148f0 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61  urrent thread ma
14900 79 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28  y be sqliteFree(
14910 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20  )ed..**.** nReq 
14920 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
14930 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
14940 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20   required. Once 
14950 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a  this much has.**
14960 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20   been released, 
14970 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
14980 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65  urns. A negative
14990 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20   value for nReq 
149a0 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73  means.** free as
149b0 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
149c0 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65  possible. The re
149d0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
149e0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
149f0 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
14a00 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
14a10 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14a20 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
14a30 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71  ANAGEMENT.int sq
14a40 6c 69 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61  lite3pager_relea
14a50 73 65 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e 52  se_memory(int nR
14a60 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72  eq){.  const Thr
14a70 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20  eadData *pTsdro 
14a80 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
14a90 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
14aa0 20 50 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74   Pager *p;.  int
14ab0 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a   nReleased = 0;.
14ac0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49    int i;..  /* I
14ad0 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c  f the the global
14ae0 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
14af0 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
14b00 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f  becomes a.  ** o
14b10 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20  -op; zero bytes 
14b20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72  of memory are fr
14b30 65 65 64 2e 20 20 54 68 69 73 20 69 73 20 62 65  eed.  This is be
14b40 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20  cause.  ** some 
14b50 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f  of the code invo
14b60 6b 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ked by this func
14b70 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20  tion may also.  
14b80 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** try to obtain
14b90 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75   the mutex, resu
14ba0 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c  lting in a deadl
14bb0 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
14bc0 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78  sqlite3OsInMutex
14bd0 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (0) ){.    retur
14be0 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  n 0;.  }..  /* O
14bf0 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75  utermost loop ru
14c00 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74  ns for at most t
14c10 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46  wo iterations. F
14c20 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77  irst iteration w
14c30 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69  e.  ** try to fi
14c40 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63  nd memory that c
14c50 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77  an be released w
14c60 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66  ithout calling f
14c70 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20  sync(). Second. 
14c80 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77   ** iteration (w
14c90 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69  hich only runs i
14ca0 66 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c  f the first fail
14cb0 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20  ed to free nReq 
14cc0 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65  bytes of.  ** me
14cd0 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74  mory) is permitt
14ce0 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63  ed to call fsync
14cf0 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63  (). This is of c
14d00 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20  ourse much more 
14d10 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e  .  ** expensive.
14d20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
14d30 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20   i<=1; i++){..  
14d40 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
14d50 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65  h all the SQLite
14d60 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62   pagers opened b
14d70 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
14d80 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  read. */.    for
14d90 28 70 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65  (p=pTsdro->pPage
14da0 72 3b 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20  r; p && (nReq<0 
14db0 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65  || nReleased<nRe
14dc0 71 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  q); p=p->pNext){
14dd0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
14de0 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  g;.      int rc;
14df0 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  ..      /* For e
14e00 61 63 68 20 70 61 67 65 72 2c 20 74 72 79 20 74  ach pager, try t
14e10 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70  o free as many p
14e20 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ages as possible
14e30 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20   (without .     
14e40 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e   ** calling fsyn
14e50 63 28 29 20 69 66 20 74 68 69 73 20 69 73 20 74  c() if this is t
14e60 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
14e70 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d  on of the outerm
14e80 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  ost .      ** lo
14e90 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  op)..      */.  
14ea0 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
14eb0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65  E_OK==(rc = page
14ec0 72 5f 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20  r_recycle(p, i, 
14ed0 26 70 50 67 29 29 20 26 26 20 70 50 67 29 20 7b  &pPg)) && pPg) {
14ee0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76  .        /* We'v
14ef0 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74  e found a page t
14f00 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20  o free. At this 
14f10 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68  point the page h
14f20 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  as been .       
14f30 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   ** removed from
14f40 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74   the page hash-t
14f50 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20  able, free-list 
14f60 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20  and synced-list 
14f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69  .        ** (pFi
14f80 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69  rstSynced). It i
14f90 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61  s still in the a
14fa0 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20  ll pages (pAll) 
14fb0 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
14fc0 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * Remove it from
14fd0 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72   this list befor
14fe0 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20  e freeing..     
14ff0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
15000 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65   Todo: Check the
15010 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73   Pager.pStmt lis
15020 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
15030 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20  his is Ok. It . 
15040 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62         ** probab
15050 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20  ly is though..  
15060 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15070 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20   PgHdr *pTmp;.  
15080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
15090 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  g );.        pag
150a0 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
150b0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
150c0 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
150d0 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
150e0 20 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70       p->pAll = p
150f0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
15100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15110 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70         for( pTmp
15120 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e  =p->pAll; pTmp->
15130 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70  pNextAll!=pPg; p
15140 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41  Tmp=pTmp->pNextA
15150 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20  ll ){}.         
15160 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20   pTmp->pNextAll 
15170 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
15180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15190 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20     nReleased += 
151a0 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28  sqliteAllocSize(
151b0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pPg);.        sq
151c0 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
151d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
151e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
151f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  ){.        /* An
15200 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77   error occured w
15210 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
15220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15230 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  le or .        *
15240 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67  * journal in pag
15250 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68  er_recycle(). Th
15260 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72  e error is not r
15270 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a  eturned to the .
15280 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65          ** calle
15290 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  r of this functi
152a0 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74  on. Instead, set
152b0 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   the Pager.errCo
152c0 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20  de variable..   
152d0 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f       ** The erro
152e0 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  r will be return
152f0 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28  ed to the user (
15300 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65  or users, in the
15310 20 63 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a   case .        *
15320 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61  * of a shared pa
15330 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68  ger cache) of th
15340 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  e pager for whic
15350 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  h the error occu
15360 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  red..        */.
15370 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15380 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
15390 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53  E_IOERR || rc==S
153a0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20  QLITE_FULL );.  
153b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
153c0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
153d0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
153e0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 2c    pager_error(p,
153f0 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
15400 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
15410 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23  n nReleased;.}.#
15420 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15430 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
15440 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a  NAGEMENT */../*.
15450 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
15460 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
15470 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
15480 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
15490 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
154a0 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
154b0 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
154c0 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
154d0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
154e0 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
154f0 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f  .**.** A _get wo
15500 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65  rks for any page
15510 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
15520 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20  than 0.  If the 
15530 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
15540 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
15550 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
15560 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74  age, then no act
15570 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  ual disk.** read
15580 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
15590 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
155a0 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74  the page is init
155b0 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c  ialized to.** al
155c0 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78  l zeros.  The ex
155d0 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
155e0 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
155f0 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
15600 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68  d.** to zeros th
15610 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  e first time a p
15620 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
15630 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  to memory..**.**
15640 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
15650 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
15660 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
15670 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
15680 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
15690 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
156a0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
156b0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
156c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
156d0 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
156e0 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  _lookup().  Both
156f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
15700 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65  d _lookup() atte
15710 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
15720 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
15730 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
15740 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
15750 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
15760 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
15770 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
15780 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
15790 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c  it in whereas _l
157a0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
157b0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
157c0 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
157d0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
157e0 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
157f0 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
15800 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
15810 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
15820 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
15830 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
15840 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65  nce _lookup() ne
15850 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
15860 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
15870 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
15880 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
15890 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
158a0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 50  lite3pager_get(P
158b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
158c0 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a  no pgno, void **
158d0 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72  ppPage){.  PgHdr
158e0 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
158f0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
15900 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
15910 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
15920 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
15930 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
15940 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
15950 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
15960 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
15970 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
15980 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
15990 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
159a0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
159b0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
159c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
159d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
159e0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
159f0 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
15a00 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
15a10 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
15a20 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
15a30 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
15a40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
15a50 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
15a60 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
15a70 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
15a80 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
15a90 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  de;.  }..  /* If
15aa0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
15ab0 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
15ac0 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
15ad0 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
15ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15af0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
15b00 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
15b10 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  & !MEMDB ){.    
15b20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
15b30 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
15b40 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
15b50 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
15b60 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
15b70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15b80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15b90 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
15ba0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
15bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15bc0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
15bd0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
15be0 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
15bf0 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
15c00 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
15c10 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
15c20 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
15c30 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
15c40 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
15c50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 68      */.    if( h
15c60 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
15c70 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 2f  ger) ){.       /
15c80 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
15c90 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
15ca0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
15cb0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
15cc0 73 0a 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  s.       ** impo
15cd0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
15ce0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
15cf0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
15d00 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
15d10 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
15d20 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
15d30 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
15d40 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
15d50 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  e.       ** data
15d60 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
15d70 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
15d80 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
15d90 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
15da0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
15db0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
15dc0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
15dd0 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
15de0 67 20 69 74 20 0a 20 20 20 20 20 20 20 2a 2a 20  g it .       ** 
15df0 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20  back..       ** 
15e00 0a 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75  .       ** Becau
15e10 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
15e20 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
15e30 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
15e40 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20 2a  ed, the.       *
15e50 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73  * second process
15e60 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69   will get to thi
15e70 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
15e80 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a  ode and fail to.
15e90 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e         ** obtain
15ea0 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53   it's own EXCLUS
15eb0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
15ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
15ed0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
15ef0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  ck(pPager->fd, E
15f00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
15f10 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
15f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15f30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
15f40 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
15f50 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
15f60 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
15f70 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
15f80 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
15f90 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
15fa0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
15fb0 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
15fc0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
15fd0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20  _EXCLUSIVE;..   
15fe0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
15ff0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
16000 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ing only.  Retur
16010 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  n SQLITE_BUSY if
16020 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72  .       ** we ar
16030 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  e unable to open
16040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
16050 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20  e. .       **.  
16060 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72       ** The jour
16070 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
16080 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
16090 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65  ked itself.  The
160a0 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  .       ** journ
160b0 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
160c0 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
160d0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
160e0 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
160f0 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   ** a write lock
16100 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65  , so there is ne
16110 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f  ver any chance o
16120 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20  f two or more.  
16130 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
16140 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f  s opening the jo
16150 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d  urnal at the sam
16160 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a  e time..       *
16170 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
16180 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
16190 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  nly(pPager->zJou
161a0 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
161b0 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  fd);.       if( 
161c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
161d0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
161e0 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
161f0 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
16200 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
16210 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
16220 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  NLOCK;.         
16230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
16240 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  SY;.       }.   
16250 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16260 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  nalOpen = 1;.   
16270 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16280 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
16290 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
162a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
162b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
162c0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
162d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
162e0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20  nalHdr = 0;..   
162f0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
16300 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
16310 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
16320 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
16330 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  .       ** lock 
16340 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
16350 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
16360 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
16370 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
16380 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
16390 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
163a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
163b0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
163c0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
163d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
163e0 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
163f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  lse{.    /* Sear
16400 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63  ch for page in c
16410 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  ache */.    pPg 
16420 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
16430 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
16440 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70    if( MEMDB && p
16450 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
16460 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
16470 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
16480 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
16490 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
164a0 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
164b0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
164c0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
164d0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
164e0 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  */.    int h;.  
164f0 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
16500 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
16510 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
16520 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  e<pPager->mxPage
16530 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72   || pPager->pFir
16540 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29  st==0 || MEMDB )
16550 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74  {.      /* Creat
16560 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a  e a new page */.
16570 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
16580 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d  ->nPage>=pPager-
16590 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  >nHash ){.      
165a0 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68    pager_resize_h
165b0 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72  ash_table(pPager
165c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61  ,.           pPa
165d0 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f  ger->nHash<256 ?
165e0 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e   256 : pPager->n
165f0 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 20  Hash*2);.       
16600 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61   if( pPager->nHa
16610 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sh==0 ){.       
16620 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16630 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
16640 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
16650 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  pPg = sqliteMall
16660 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
16670 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  Pg) + pPager->pa
16680 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  geSize.         
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
166b0 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
166c0 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  tra.            
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
166f0 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20  (PgHistory) );. 
16700 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
16710 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
16720 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
16730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
16740 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a  mset(pPg, 0, siz
16750 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20  eof(*pPg));.    
16760 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
16770 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
16780 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
16790 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a   pPager), 0, siz
167a0 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b  eof(PgHistory));
167b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
167c0 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
167d0 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ger;.      pPg->
167e0 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65  pNextAll = pPage
167f0 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70  r->pAll;.      p
16800 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50  Pager->pAll = pP
16810 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  g;.      pPager-
16820 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20  >nPage++;.      
16830 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
16840 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61  e>pPager->nMaxPa
16850 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ge ){.        as
16860 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d  sert( pPager->nM
16870 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d  axPage==(pPager-
16880 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20  >nPage-1) );.   
16890 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61       pPager->nMa
168a0 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d  xPage++;.      }
168b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
168c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
168d0 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20  ycle(pPager, 1, 
168e0 26 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  &pPg);.      if(
168f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16900 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
16910 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
16920 20 20 20 61 73 73 65 72 74 28 70 50 67 29 20 3b     assert(pPg) ;
16930 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
16940 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
16950 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
16960 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
16970 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
16980 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
16990 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65    sqlite3CheckMe
169a0 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e  mory(pPager->aIn
169b0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29  Journal, pgno/8)
169c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
169d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
169e0 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pen );.      pPg
169f0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
16a00 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
16a10 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
16a20 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
16a30 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
16a40 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nc = 0;.    }els
16a50 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
16a60 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
16a70 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
16a80 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
16a90 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
16aa0 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  tmt && (int)pgno
16ab0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
16ac0 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
16ad0 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  && (pPager->aInS
16ae0 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  tmt[pgno/8] & (1
16af0 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20  <<(pgno&7)))!=0 
16b00 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  ){.      page_ad
16b10 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
16b20 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
16b30 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76        page_remov
16b40 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
16b50 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
16b60 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
16b70 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  .    pPg->nRef =
16b80 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28   1;.    REFINFO(
16b90 70 50 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65  pPg);..    pPage
16ba0 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69  r->nRef++;.    i
16bb0 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  f( pPager->nExtr
16bc0 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  a>0 ){.      mem
16bd0 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54  set(PGHDR_TO_EXT
16be0 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  RA(pPg, pPager),
16bf0 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
16c00 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ra);.    }.    i
16c10 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
16c20 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  de ){.      sqli
16c30 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50  te3pager_unref(P
16c40 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16c50 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ));.      rc = p
16c60 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
16c70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
16c90 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65  opulate the page
16ca0 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68   with data, eith
16cb0 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72  er by reading fr
16cc0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  om the database.
16cd0 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20      ** file, or 
16ce0 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  by setting the e
16cf0 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65  ntire page to ze
16d00 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ro..    */.    i
16d10 66 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  f( sqlite3pager_
16d20 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
16d30 29 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d  )<(int)pgno || M
16d40 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65  EMDB ){.      me
16d50 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
16d60 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
16d70 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
16d80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16d90 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30  assert( MEMDB==0
16da0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
16db0 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
16dc0 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
16dd0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
16de0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
16df0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16e00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
16e10 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
16e20 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
16e30 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a  R_TO_DATA(pPg),.
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
16e60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
16e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
16e80 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20  RACE3("FETCH %d 
16e90 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
16ea0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
16eb0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
16ec0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50 47  ODEC1(pPager, PG
16ed0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16ee0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
16ef0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16f10 20 20 20 20 69 36 34 20 66 69 6c 65 53 69 7a 65      i64 fileSize
16f20 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ;.        int rc
16f30 32 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  2 = sqlite3OsFil
16f40 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
16f50 2c 20 26 66 69 6c 65 53 69 7a 65 29 3b 0a 20 20  , &fileSize);.  
16f60 20 20 20 20 20 20 69 66 28 20 72 63 32 21 3d 53        if( rc2!=S
16f70 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 69 6c 65  QLITE_OK || file
16f80 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65  Size>=pgno*pPage
16f90 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 09  r->pageSize ){..
16fa0 20 20 2f 2a 20 41 6e 20 49 4f 20 65 72 72 6f 72    /* An IO error
16fb0 20 6f 63 63 75 72 65 64 20 69 6e 20 6f 6e 65 20   occured in one 
16fc0 6f 66 20 74 68 65 20 74 68 65 20 73 71 6c 69 74  of the the sqlit
16fd0 65 33 4f 73 53 65 65 6b 28 29 20 6f 72 0a 20 20  e3OsSeek() or.  
16fe0 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
16ff0 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 73  e3OsRead() calls
17000 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20   above. */.     
17010 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d       pPg->pgno =
17020 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   0;.          sq
17030 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
17040 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
17050 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pg));.          
17060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17080 20 20 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61      clear_simula
17090 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a  ted_io_error();.
170a0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
170b0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
170c0 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
170d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
170e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
170f0 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f 49  {.        TEST_I
17100 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
17110 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
17120 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74  }..    /* Link t
17130 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
17140 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65   page hash table
17150 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f   */.    h = pgno
17160 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
17170 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  h-1);.    assert
17180 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ( pgno!=0 );.   
17190 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
171a0 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
171b0 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
171c0 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
171d0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
171e0 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
171f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
17200 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
17210 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
17220 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
17230 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
17240 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
17250 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
17260 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
17270 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
17280 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
17290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
172a0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
172b0 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
172c0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
172d0 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
172e0 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67  ->nHit);.    pag
172f0 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
17300 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44    *ppPage = PGHD
17310 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
17320 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17330 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
17340 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
17350 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
17360 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
17370 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
17380 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
17390 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
173a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
173b0 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
173c0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
173d0 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
173e0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
173f0 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20  te3pager_get(). 
17400 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
17410 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
17420 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
17430 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69  te3pager_get() i
17440 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
17450 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
17460 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
17470 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
17480 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
17490 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
174a0 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
174b0 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
174c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
174d0 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
174e0 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
174f0 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
17500 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  pened..*/.void *
17510 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
17520 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
17530 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
17540 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
17550 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
17560 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17570 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  gno!=0 );.  if( 
17580 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
17590 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
175a0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
175b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
175c0 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67  .  }.  pPg = pag
175d0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
175e0 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
175f0 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Pg==0 ) return 0
17600 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
17610 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  );.  return PGHD
17620 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
17630 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
17640 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
17650 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
17660 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
17670 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
17680 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
17690 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
176a0 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
176b0 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
176c0 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
176d0 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
176e0 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
176f0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
17700 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17710 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
17720 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
17730 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20  ager_unref(void 
17740 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
17750 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63   *pPg;..  /* Dec
17760 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
17770 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
17780 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
17790 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
177a0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73  HDR(pData);.  as
177b0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
177c0 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  0 );.  pPg->nRef
177d0 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
177e0 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  g);..  CHECK_PAG
177f0 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68  E(pPg);..  /* Wh
17800 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
17810 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
17820 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63   page reach 0, c
17830 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  all the.  ** des
17840 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20  tructor and add 
17850 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
17860 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
17870 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
17880 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
17890 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67  pPager;.    pPag
178a0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
178b0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
178c0 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Free = 0;.    pP
178d0 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  g->pPrevFree = p
178e0 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20  Pager->pLast;.  
178f0 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
17900 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
17910 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
17920 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
17930 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
17940 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73   = pPg;.    }els
17950 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
17960 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20  >pFirst = pPg;. 
17970 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
17980 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26  ->needSync==0 &&
17990 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
179a0 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ynced==0 ){.    
179b0 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
179c0 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20  Synced = pPg;.  
179d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
179e0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
179f0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
17a00 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61  >xDestructor(pDa
17a10 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
17a20 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Size);.    }.  .
17a30 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
17a40 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
17a50 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
17a60 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
17a70 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
17a80 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
17a90 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
17aa0 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
17ab0 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
17ac0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
17ad0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
17ae0 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
17af0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
17b00 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
17b10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17b20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
17b30 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
17b40 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
17b50 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
17b60 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
17b70 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
17b80 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
17b90 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
17ba0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
17bb0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
17bc0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17bd0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
17be0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
17bf0 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
17c00 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
17c10 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
17c20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
17c30 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
17c40 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
17c50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
17c60 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
17c70 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
17c80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
17c90 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
17ca0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
17cb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17cc0 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pen==0 );.  asse
17cd0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
17ce0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
17cf0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
17d00 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73  ournal==0 );.  s
17d10 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
17d20 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
17d30 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
17d40 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nal = sqliteMall
17d50 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
17d60 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
17d70 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
17d80 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
17d90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17da0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
17db0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
17dc0 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  l;.  }.  rc = sq
17dd0 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
17de0 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  sive(pPager->zJo
17df0 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
17e00 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  jfd,.           
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 74 65        pPager->te
17e30 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65  mpFile);.  pPage
17e40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
17e50 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
17e60 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
17e70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17e80 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
17e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17ea0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
17eb0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
17ec0 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74  }.  sqlite3OsSet
17ed0 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
17ee0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  >jfd, pPager->fu
17ef0 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c  ll_fsync);.  sql
17f00 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e  ite3OsSetFullSyn
17f10 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
17f20 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
17f30 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70  );.  sqlite3OsOp
17f40 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67  enDirectory(pPag
17f50 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
17f60 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  >zDirectory);.  
17f70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17f80 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
17f90 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
17fa0 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
17fb0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
17fc0 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
17fd0 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
17fe0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
17ff0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
18000 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
18010 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
18020 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  de;.    goto fai
18030 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
18040 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
18050 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
18060 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
18070 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
18080 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
18090 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
180a0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  stmtAutoopen && 
180b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
180c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
180d0 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69  3pager_stmt_begi
180e0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
180f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18100 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
18110 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63  _NOMEM ){.    rc
18120 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
18130 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
18140 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18150 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
18160 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
18170 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
18180 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
18190 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
181a0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
181b0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
181c0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
181d0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28  urnal = 0;.  if(
181e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
181f0 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  M ){.    /* If t
18200 68 69 73 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63  his was a malloc
18210 28 29 20 66 61 69 6c 75 72 65 2c 20 74 68 65 6e  () failure, then
18220 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   we will not be 
18230 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65  closing the page
18240 72 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53  r.    ** file. S
18250 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75  o delete any jou
18260 72 6e 61 6c 20 66 69 6c 65 20 77 65 20 6d 61 79  rnal file we may
18270 20 68 61 76 65 20 6a 75 73 74 20 63 72 65 61 74   have just creat
18280 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  ed. Otherwise,. 
18290 20 20 20 2a 2a 20 74 68 65 20 73 79 73 74 65 6d     ** the system
182a0 20 77 69 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73   will get confus
182b0 65 64 2c 20 77 65 20 68 61 76 65 20 61 20 72 65  ed, we have a re
182c0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  ad-lock on the f
182d0 69 6c 65 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a  ile and a.    **
182e0 20 6d 79 73 74 65 72 69 6f 75 73 20 6a 6f 75 72   mysterious jour
182f0 6e 61 6c 20 68 61 73 20 61 70 70 65 61 72 65 64  nal has appeared
18300 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
18310 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  em..    */.    s
18320 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
18330 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
18340 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
18350 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
18360 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
18370 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
18380 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
18390 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  NLOCK;.  }.  ret
183a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
183b0 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
183c0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
183d0 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
183e0 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
183f0 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
18400 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
18410 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
18420 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
18430 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  mit() is called.
18440 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
18450 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
18460 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
18470 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
18480 5f 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  _close() is call
18490 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
184a0 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
184b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e   is called to on
184c0 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69   every outstandi
184d0 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ng page..**.** T
184e0 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
184f0 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
18500 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
18510 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
18520 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
18530 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
18540 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
18550 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
18560 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f  s used merely to
18570 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f  .** acquire a po
18580 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
18590 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
185a0 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
185b0 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  here is.** alrea
185c0 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
185d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
185e0 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
185f0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
18600 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70  ates how much sp
18610 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20  ace in bytes to 
18620 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a  reserve for a.**
18630 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18640 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65  file-name at the
18650 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
18660 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73  urnal when it is
18670 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
18680 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  A journal file i
18690 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73  s opened if this
186a0 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
186b0 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74  ary file.  For t
186c0 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
186d0 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f  s, the opening o
186e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
186f0 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
18700 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
18710 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20  .** actual need 
18720 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
18730 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
18740 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
18750 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76  s already reserv
18760 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20  ed for writing, 
18770 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18780 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
18790 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
187a0 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  , go ahead and g
187b0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
187c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
187d0 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
187e0 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69  instead of waiti
187f0 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20  ng until we try 
18800 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  to flush the cac
18810 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c  he.  The.** exFl
18820 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  ag is ignored if
18830 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
18840 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
18850 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18860 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64  pager_begin(void
18870 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46   *pData, int exF
18880 6c 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  lag){.  PgHdr *p
18890 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
188a0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
188b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
188c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
188d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
188e0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
188f0 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
18900 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
18910 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
18920 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
18930 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
18940 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
18950 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
18960 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
18970 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
18980 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
18990 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
189a0 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
189b0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
189c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
189d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
189e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
189f0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
18a00 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
18a10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
18a20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18a30 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
18a40 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
18a50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
18a60 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
18a70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
18a80 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
18a90 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
18aa0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18ab0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
18ac0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18ad0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18ae0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
18af0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
18b00 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  che = 0;.      T
18b10 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49  RACE2("TRANSACTI
18b20 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
18b30 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
18b40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
18b50 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
18b60 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
18b70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
18b80 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
18b90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18ba0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
18bb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18bc0 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69  * Make a page di
18bd0 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69  rty.  Set its di
18be0 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64  rty flag and add
18bf0 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79   it to the dirty
18c00 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  .** page list..*
18c10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
18c20 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70  keDirty(PgHdr *p
18c30 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
18c40 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20  dirty==0 ){.    
18c50 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
18c60 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
18c70 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
18c80 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
18c90 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74   = pPager->pDirt
18ca0 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  y;.    if( pPage
18cb0 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  r->pDirty ){.   
18cc0 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
18cd0 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  y->pPrevDirty = 
18ce0 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
18cf0 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  Pg->pPrevDirty =
18d00 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
18d10 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  pDirty = pPg;.  
18d20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
18d30 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43  a page clean.  C
18d40 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62  lear its dirty b
18d50 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74  it and remove it
18d60 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72   from the.** dir
18d70 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ty page list..*/
18d80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
18d90 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50  eClean(PgHdr *pP
18da0 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
18db0 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d  irty ){.    pPg-
18dc0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
18dd0 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20  if( pPg->pDirty 
18de0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44  ){.      pPg->pD
18df0 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
18e00 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72   = pPg->pPrevDir
18e10 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ty;.    }.    if
18e20 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  ( pPg->pPrevDirt
18e30 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  y ){.      pPg->
18e40 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72  pPrevDirty->pDir
18e50 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
18e60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18e70 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
18e80 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
18e90 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
18ea0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  }.../*.** Mark a
18eb0 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
18ec0 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
18ed0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
18ee0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
18ef0 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
18f00 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
18f10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
18f20 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
18f30 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
18f40 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
18f50 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
18f60 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
18f70 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
18f80 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
18f90 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
18fa0 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
18fb0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
18fc0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
18fd0 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
18fe0 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
18ff0 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
19000 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
19010 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
19020 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
19030 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
19040 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
19050 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
19060 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
19070 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
19080 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
19090 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
190a0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
190b0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
190c0 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
190d0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
190e0 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
190f0 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
19100 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
19110 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
19120 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
19130 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
19140 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
19150 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
19160 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
19170 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
19180 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
19190 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
191a0 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
191b0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
191c0 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
191d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
191e0 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
191f0 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
19200 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
19210 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
19220 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
19230 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
19240 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19250 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
19260 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
19270 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
19280 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
19290 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
192a0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
192b0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
192c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
192d0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
192e0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
192f0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
19300 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
19310 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  Pg);..  /* Mark 
19320 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
19330 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
19340 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
19350 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
19360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
19370 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
19380 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
19390 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67  .  makeDirty(pPg
193a0 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e  );.  if( pPg->in
193b0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d  Journal && (pPg-
193c0 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65  >inStmt || pPage
193d0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29  r->stmtInUse==0)
193e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
193f0 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
19400 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
19410 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
19420 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
19430 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
19440 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
19450 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
19460 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
19470 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
19480 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
19490 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
194a0 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20  **.    ** First 
194b0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61  check to see tha
194c0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
194d0 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  n journal exists
194e0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61   and.    ** crea
194f0 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73  te it if it does
19500 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   not..    */.   
19510 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19520 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
19530 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  LOCK );.    rc =
19540 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65   sqlite3pager_be
19550 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20  gin(pData, 0);. 
19560 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
19580 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
19590 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
195a0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
195b0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
195c0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
195d0 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
195e0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
195f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
19600 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
19610 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
19620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19630 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19640 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
19650 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19660 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
19670 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
19680 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
19690 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20  ache = 1;.  .   
196a0 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
196b0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
196c0 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
196d0 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
196e0 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
196f0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
19700 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
19710 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
19720 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
19730 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
19740 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
19750 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
19760 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
19770 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  /.    if( !pPg->
19780 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
19790 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
197a0 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20   || MEMDB) ){.  
197b0 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
197c0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
197d0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
197e0 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67          int szPg
197f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45  ;.        if( ME
19800 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MDB ){.         
19810 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
19820 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
19830 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
19840 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 33            TRACE3
19850 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
19860 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
19870 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
19880 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
19890 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
198a0 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Orig==0 );.     
198b0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69       pHist->pOri
198c0 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
198d0 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67  Raw( pPager->pag
198e0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
198f0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
19900 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rig ){.         
19910 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d     memcpy(pHist-
19920 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f  >pOrig, PGHDR_TO
19930 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
19940 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
19950 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19970 20 20 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73      u32 cksum, s
19980 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20  aved;.          
19990 63 68 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70  char *pData2, *p
199a0 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  End;.          /
199b0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
199c0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
199d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
199e0 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
199f0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
19a00 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
19a10 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
19a20 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
19a30 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
19a40 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
19a50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
19a60 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
19a70 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
19a80 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
19a90 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45     pData2 = CODE
19aa0 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
19ab0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
19ac0 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
19ad0 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
19ae0 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
19af0 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  a2);.          p
19b00 45 6e 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70  End = pData2 + p
19b10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
19b20 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
19b30 32 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  2 -= 4;.        
19b40 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a    saved = *(u32*
19b50 29 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20  )pEnd;.         
19b60 20 70 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c   put32bits(pEnd,
19b70 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
19b80 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72     szPg = pPager
19b90 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20  ->pageSize+8;.  
19ba0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
19bb0 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
19bc0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
19bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19be0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
19bf0 20 70 44 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a   pData2, szPg);.
19c00 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
19c10 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
19c20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20  szPg;.          
19c30 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20  TRACE4("JOURNAL 
19c40 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
19c50 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
19c60 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
19c70 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
19c80 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
19c90 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20  edSync);.       
19ca0 20 20 20 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d     *(u32*)pEnd =
19cb0 20 73 61 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41   saved;...  /* A
19cc0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
19cd0 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
19ce0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
19cf0 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   The .          
19d00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
19d10 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
19d20 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
19d30 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20  above..         
19d40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
19d50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19d60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
19d70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19d80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
19d90 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
19da0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
19db0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
19dc0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
19dd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
19de0 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
19df0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
19e00 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
19e10 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
19e20 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
19e30 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  Sync;.          
19e40 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
19e50 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20  InUse ){.       
19e60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
19e70 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
19e80 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
19e90 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
19ea0 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
19eb0 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
19ec0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
19ed0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
19ee0 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  {.        pPg->n
19ef0 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
19f00 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
19f10 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
19f20 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52  Sync;.        TR
19f30 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20  ACE4("APPEND %d 
19f40 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
19f50 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
19f60 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
19f70 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
19f80 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
19f90 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
19fa0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
19fb0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ync ){.        p
19fc0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
19fd0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
19fe0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
19ff0 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  l = 1;.    }.  .
1a000 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
1a010 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1a020 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
1a030 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
1a040 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
1a050 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1a060 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
1a070 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
1a080 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
1a090 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
1a0a0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
1a0b0 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
1a0c0 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
1a0d0 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
1a0e0 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
1a0f0 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
1a100 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
1a110 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1a120 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
1a130 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
1a140 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
1a150 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
1a160 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ze ){.      asse
1a170 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1a180 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1a190 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1a1a0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
1a1b0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1a1c0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1a1d0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1a1e0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1a1f0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
1a200 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
1a210 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
1a220 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
1a230 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
1a240 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a250 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1a260 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
1a270 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1a280 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
1a290 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1a2a0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1a2b0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
1a2c0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
1a2d0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
1a2e0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1a2f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1a300 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
1a310 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
1a320 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44  ar *pData2 = COD
1a330 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
1a340 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
1a350 2d 34 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  -4;.        put3
1a360 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50  2bits(pData2, pP
1a370 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1a380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a390 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74  Write(pPager->st
1a3a0 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
1a3b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b  er->pageSize+4);
1a3c0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
1a3d0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1a3e0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1a3f0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1a400 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1a410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1a430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a440 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1a450 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
1a460 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1a470 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1a480 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1a490 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1a4a0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1a4b0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1a4c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a4d0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
1a4e0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
1a4f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
1a500 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
1a510 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
1a520 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
1a530 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
1a540 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
1a550 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1a560 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
1a570 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
1a580 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
1a590 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
1a5a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
1a5b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1a5c0 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
1a5d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a5e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1a5f0 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
1a600 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1a610 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
1a620 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
1a630 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  o sqlite3pager_w
1a640 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
1a650 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
1a660 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
1a670 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
1a680 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1a690 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
1a6a0 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
1a6b0 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
1a6c0 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74  eable(void *pDat
1a6d0 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
1a6e0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1a6f0 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
1a700 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
1a710 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1a720 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
1a730 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UM./*.** Replace
1a740 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1a750 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69  a single page wi
1a760 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  th the informati
1a770 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a  on in the third.
1a780 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
1a790 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1a7a0 5f 6f 76 65 72 77 72 69 74 65 28 50 61 67 65 72  _overwrite(Pager
1a7b0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
1a7c0 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  gno, void *pData
1a7d0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65  ){.  void *pPage
1a7e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
1a7f0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1a800 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  _get(pPager, pgn
1a810 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66  o, &pPage);.  if
1a820 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a830 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1a840 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
1a850 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1a860 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a870 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
1a880 67 65 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  ge, pData, pPage
1a890 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1a8a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70    }.    sqlite3p
1a8b0 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
1a8c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1a8d0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1a8e0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1a8f0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1a900 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1a910 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1a920 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
1a930 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1a940 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62  on page "pgno" b
1a950 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
1a960 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
1a970 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
1a980 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
1a990 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
1a9a0 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
1a9b0 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
1a9c0 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
1a9d0 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
1a9e0 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
1a9f0 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
1aa00 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
1aa10 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1aa20 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
1aa30 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
1aa40 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
1aa50 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
1aa60 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
1aa70 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
1aa80 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
1aa90 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
1aaa0 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
1aab0 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
1aac0 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
1aad0 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
1aae0 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
1aaf0 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
1ab00 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
1ab10 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
1ab20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1ab30 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
1ab40 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
1ab50 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
1ab60 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1ab70 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  o sqlite3pager_d
1ab80 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
1ab90 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  or the same page
1aba0 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66  .** will thereaf
1abb0 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20  ter be ignored. 
1abc0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
1abd0 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72  ry to avoid a pr
1abe0 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61  oblem.** where a
1abf0 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20   page with data 
1ac00 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1ac10 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
1ac20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61  one part of.** a
1ac30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
1ac40 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  n removed from t
1ac50 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1ac60 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a  ng a later part.
1ac70 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74  ** of the same t
1ac80 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
1ac90 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f  eused for some o
1aca0 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57  ther purpose.  W
1acb0 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72  hen it.** is fir
1acc0 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  st added to the 
1acd0 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72  freelist, this r
1ace0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1acf0 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a  .  When reused,.
1ad00 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  ** the dont_roll
1ad10 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69  back() routine i
1ad20 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62  s called.  But b
1ad30 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
1ad40 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74  contains.** crit
1ad50 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74  ical data, we st
1ad60 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
1ad70 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c  ure it gets roll
1ad80 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
1ad90 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f  .** of the dont_
1ada0 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  rollback() call.
1adb0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1adc0 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65  pager_dont_write
1add0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1ade0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1adf0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
1ae00 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
1ae10 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
1ae20 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1ae30 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
1ae40 70 50 67 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65  pPg!=0 );  /* We
1ae50 20 6e 65 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e   never call _don
1ae60 74 5f 77 72 69 74 65 20 75 6e 6c 65 73 73 20 74  t_write unless t
1ae70 68 65 20 70 61 67 65 20 69 73 20 69 6e 20 6d 65  he page is in me
1ae80 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61  m */.  pPg->alwa
1ae90 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
1aea0 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
1aeb0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
1aec0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 69 66  tInUse ){.    if
1aed0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1aee0 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
1aef0 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
1af00 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
1af10 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
1af20 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
1af30 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
1af40 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
1af50 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
1af60 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
1af70 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
1af80 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1af90 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
1afa0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
1afb0 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
1afc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1afd0 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
1afe0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1aff0 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
1b000 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
1b010 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
1b020 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
1b030 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
1b040 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
1b050 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
1b060 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
1b070 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
1b080 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1b090 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
1b0a0 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
1b0b0 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
1b0c0 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
1b0d0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
1b0e0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
1b0f0 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
1b100 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1b110 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
1b120 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
1b130 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
1b140 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50  f %d\n", pgno, P
1b150 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1b160 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
1b170 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51  (pPg);.#ifdef SQ
1b180 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1b190 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
1b1a0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1b1b0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1b1c0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
1b1d0 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
1b1e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
1b1f0 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
1b200 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
1b210 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
1b220 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
1b230 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
1b240 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
1b250 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
1b260 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
1b270 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
1b280 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
1b290 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
1b2a0 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
1b2b0 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urnal..*/.void s
1b2c0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
1b2d0 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _rollback(void *
1b2e0 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
1b2f0 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
1b300 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
1b310 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1b320 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69  Pg->pPager;..  i
1b330 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1b340 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  !=PAGER_EXCLUSIV
1b350 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  E || pPager->jou
1b360 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
1b370 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
1b380 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1b390 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
1b3a0 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d  sRollback || MEM
1b3b0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1b3c0 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
1b3d0 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
1b3e0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1b3f0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1b400 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b410 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
1b420 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1b430 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
1b440 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1b450 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1b460 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1b470 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
1b480 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1b490 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
1b4a0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1b4b0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1b4c0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
1b4d0 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
1b4e0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
1b4f0 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e  .    TRACE3("DON
1b500 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
1b510 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
1b520 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1b530 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
1b540 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1b550 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
1b560 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
1b570 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
1b580 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
1b590 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1b5a0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
1b5b0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1b5c0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1b5d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b5e0 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
1b5f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1b600 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1b610 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1b620 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
1b630 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1b640 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
1b650 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
1b660 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1b670 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
1b680 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1b690 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1b6a0 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
1b6b0 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
1b6c0 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
1b6d0 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
1b6e0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1b6f0 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
1b700 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
1b710 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
1b720 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1b730 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1b740 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  _commit(Pager *p
1b750 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1b760 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1b770 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1b780 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
1b790 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1b7a0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
1b7b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
1b7c0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
1b7d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b7e0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  E_ERROR;.  }.  T
1b7f0 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64  RACE2("COMMIT %d
1b800 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1b810 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
1b820 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  DB ){.    pPg = 
1b830 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
1b840 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
1b850 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50  );.    while( pP
1b860 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  g ){.      clear
1b870 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
1b880 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1b890 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  r));.      pPg->
1b8a0 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
1b8b0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1b8c0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1b8d0 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
1b8e0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1b8f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1b900 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
1b910 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
1b920 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
1b930 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
1b940 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
1b950 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e  y = 0;.#ifndef N
1b960 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50  DEBUG.    for(pP
1b970 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
1b980 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
1b990 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
1b9a0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1b9b0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1b9c0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1b9d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
1b9e0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1b9f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ba00 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
1ba10 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ba20 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
1ba30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1ba40 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
1ba50 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1ba60 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1ba70 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
1ba80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ba90 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1baa0 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b  dirtyCache==0 ){
1bab0 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72  .    /* Exit ear
1bac0 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e  ly (without doin
1bad0 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75  g the time-consu
1bae0 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53 79  ming sqlite3OsSy
1baf0 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20  nc() calls).    
1bb00 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76 65  ** if there have
1bb10 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   been no changes
1bb20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1bb30 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73   file. */.    as
1bb40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1bb50 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
1bb60 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
1bb70 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1bb80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
1bb90 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65  ize = -1;.    re
1bba0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1bbb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1bbc0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
1bbd0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1bbe0 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20 30  r_sync(pPager, 0
1bbf0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
1bc00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bc10 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
1bc20 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1bc30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
1bc40 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  ize = -1;.  }.  
1bc50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bc60 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
1bc70 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
1bc80 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
1bc90 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
1bca0 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
1bcb0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
1bcc0 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
1bcd0 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
1bce0 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
1bcf0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
1bd00 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
1bd10 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
1bd20 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
1bd30 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
1bd40 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
1bd50 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
1bd60 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
1bd70 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ol (SQLITE_PROTO
1bd80 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73  COL) or unless s
1bd90 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
1bda0 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20  cess is writing 
1bdb0 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a  trash into the j
1bdc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c  ournal file (SQL
1bdd0 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a  ITE_CORRUPT) or.
1bde0 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f  ** unless a prio
1bdf0 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  r malloc() faile
1be00 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  d (SQLITE_NOMEM)
1be10 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
1be20 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72  rror.** codes ar
1be30 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61  e returned for a
1be40 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f  ll these occasio
1be50 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  ns.  Otherwise,.
1be60 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1be70 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
1be80 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
1be90 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
1bea0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1beb0 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42  .  TRACE2("ROLLB
1bec0 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
1bed0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
1bee0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1bef0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
1bf00 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
1bf10 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
1bf20 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
1bf30 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
1bf40 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61     assert( !p->a
1bf50 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
1bf60 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64  .      if( !p->d
1bf70 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
1bf80 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
1bf90 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
1bfa0 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
1bfb0 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
1bfc0 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
1bfd0 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
1bfe0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
1bff0 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  r))->pStmt );.  
1c000 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1c010 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
1c020 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1c030 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b  HIST(p, pPager);
1c040 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
1c050 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
1c060 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
1c070 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73  TO_DATA(p), pHis
1c080 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72  t->pOrig, pPager
1c090 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1c0a0 20 20 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c       TRACE3("ROL
1c0b0 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66  LBACK-PAGE %d of
1c0c0 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
1c0d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c0e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1c0f0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
1c100 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
1c110 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
1c120 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
1c130 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er));.      }.  
1c140 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
1c150 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
1c160 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1c170 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
1c180 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
1c190 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1c1a0 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  p->pPrevStmt = p
1c1b0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
1c1c0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1c1d0 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
1c1e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c1f0 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f  xReiniter(PGHDR_
1c200 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50 61 67  TO_DATA(p), pPag
1c210 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c220 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c230 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1c240 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1c250 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
1c260 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1c270 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1c280 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54  ize;.    memoryT
1c290 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
1c2a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1c2b0 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
1c2c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1c2d0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
1c2e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c2f0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
1c300 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1c310 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
1c320 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
1c330 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
1c340 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
1c350 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
1c360 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
1c370 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
1c380 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1c390 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
1c3a0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
1c3b0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
1c3c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c3d0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
1c3e0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
1c3f0 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
1c400 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1c410 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1c420 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1c430 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1c440 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
1c450 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63   int rc2;.    rc
1c460 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f   = pager_reload_
1c470 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
1c480 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75     rc2 = pager_u
1c490 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
1c4a0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
1c4b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c4c0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
1c4d0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1c4e0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1c4f0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
1c500 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1c510 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66  e = -1;..  /* If
1c520 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1c530 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41   during a ROLLBA
1c540 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f  CK, we can no lo
1c550 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70  nger trust the p
1c560 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e  ager.  ** cache.
1c570 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
1c580 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
1c590 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
1c5a0 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65  y error .  ** pe
1c5b0 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20  rsistent..  */. 
1c5c0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1c5d0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1c5e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1c5f0 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
1c600 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
1c610 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
1c620 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
1c630 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1c640 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
1c650 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
1c660 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
1c670 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
1c680 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1c690 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
1c6a0 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
1c6b0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1c6c0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
1c6d0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
1c6e0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
1c6f0 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
1c700 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1c710 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d   pPager->nRef;.}
1c720 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1c730 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
1c740 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1c750 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
1c760 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
1c770 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61  /.int *sqlite3pa
1c780 67 65 72 5f 73 74 61 74 73 28 50 61 67 65 72 20  ger_stats(Pager 
1c790 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
1c7a0 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
1c7b0 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[0] = pPager->n
1c7c0 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50  Ref;.  a[1] = pP
1c7d0 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61  ager->nPage;.  a
1c7e0 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78  [2] = pPager->mx
1c7f0 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  Page;.  a[3] = p
1c800 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1c810 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
1c820 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
1c830 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1c840 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
1c850 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
1c860 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
1c870 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d    a[8] = pPager-
1c880 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d  >nOvfl;.  a[9] =
1c890 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
1c8a0 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
1c8b0 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  ->nWrite;.  retu
1c8c0 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn a;.}.#endif..
1c8d0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74  /*.** Set the st
1c8e0 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
1c8f0 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   point..**.** Th
1c900 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
1c910 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
1c920 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c930 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
1c940 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
1c950 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1c960 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
1c970 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
1c980 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
1c990 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
1c9a0 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69  e SQL command wi
1c9b0 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72  thin a larger tr
1c9c0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
1c9d0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
1c9e0 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20  tmt_begin(Pager 
1c9f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1ca00 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  rc;.  char zTemp
1ca10 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
1ca20 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74  _SIZE];.  assert
1ca30 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  ( !pPager->stmtI
1ca40 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74  nUse );.  assert
1ca50 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1ca60 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28  >=0 );.  TRACE2(
1ca70 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
1ca80 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1ca90 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
1caa0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1cab0 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
1cac0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
1cad0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1cae0 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
1caf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1cb00 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1cb10 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
1cb20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
1cb30 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
1cb40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cb50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1cb60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cb70 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  pen );.  pPager-
1cb80 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74  >aInStmt = sqlit
1cb90 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
1cba0 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
1cbb0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
1cbc0 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
1cbd0 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   /* sqlite3OsLoc
1cbe0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
1cbf0 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20  ARED_LOCK); */. 
1cc00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1cc10 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
1cc20 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
1cc30 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1cc40 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
1cc50 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53   &pPager->stmtJS
1cc60 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
1cc70 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
1cc80 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72  _failed;.  asser
1cc90 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  t( pPager->stmtJ
1cca0 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e  Size == pPager->
1ccb0 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65  journalOff );.#e
1ccc0 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73  ndif.  pPager->s
1ccd0 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
1cce0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
1ccf0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
1cd00 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1cd10 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
1cd20 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
1cd30 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
1cd40 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
1cd50 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
1cd60 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
1cd70 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1cd80 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  e3pager_opentemp
1cd90 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d  (zTemp, &pPager-
1cda0 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20  >stfd);.    if( 
1cdb0 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
1cdc0 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
1cdd0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
1cde0 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  n = 1;.    pPage
1cdf0 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
1ce00 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
1ce10 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
1ce20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ce30 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66  ;. .stmt_begin_f
1ce40 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61  ailed:.  if( pPa
1ce50 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a  ger->aInStmt ){.
1ce60 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1ce70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b  Pager->aInStmt);
1ce80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1ce90 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
1cea0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ceb0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61  .** Commit a sta
1cec0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
1ced0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
1cee0 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  _commit(Pager *p
1cef0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
1cf00 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1cf10 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1cf20 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54  g, *pNext;.    T
1cf30 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d  RACE2("STMT-COMM
1cf40 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
1cf50 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1cf60 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
1cf70 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
1cf80 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
1cf90 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  0);.      /* sql
1cfa0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
1cfb0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
1cfc0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
1cfd0 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
1cfe0 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
1cff0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
1d000 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
1d010 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
1d020 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
1d030 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  ext){.      pNex
1d040 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
1d050 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mt;.      assert
1d060 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b  ( pPg->inStmt );
1d070 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
1d080 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1d090 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
1d0a0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
1d0b0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  0;.      if( MEM
1d0c0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  DB ){.        Pg
1d0d0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
1d0e0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1d0f0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
1d100 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
1d110 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
1d120 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
1d130 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
1d140 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
1d150 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
1d160 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1d170 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
1d180 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1d190 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
1d1a0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
1d1b0 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
1d1c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1d1d0 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
1d1e0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
1d1f0 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72  ite3pager_stmt_r
1d200 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
1d210 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1d220 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1d230 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1d240 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f   TRACE2("STMT-RO
1d250 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
1d260 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1d270 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1d280 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
1d290 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67  g;.      for(pPg
1d2a0 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
1d2b0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
1d2c0 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20  extStmt){.      
1d2d0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1d2e0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1d2f0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1d300 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
1d310 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
1d320 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
1d330 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1d340 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  , pHist->pStmt, 
1d350 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1d370 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
1d380 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
1d390 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
1d3a0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
1d3b0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
1d3c0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
1d3d0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20  er->stmtSize;.  
1d3e0 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
1d3f0 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
1d400 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d420 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74     rc = pager_st
1d430 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  mt_playback(pPag
1d440 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
1d450 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
1d460 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
1d470 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1d480 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d490 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
1d4a0 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
1d4b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d4c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
1d4d0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
1d4e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d4f0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
1d500 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66   *sqlite3pager_f
1d510 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
1d520 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1d530 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1d540 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
1d550 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
1d560 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
1d570 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
1d580 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61   char *sqlite3pa
1d590 67 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65  ger_dirname(Page
1d5a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1d5b0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69  turn pPager->zDi
1d5c0 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  rectory;.}../*.*
1d5d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
1d5e0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
1d5f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
1d600 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1d610 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72  qlite3pager_jour
1d620 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
1d630 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1d640 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d650 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
1d660 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63  rn true if fsync
1d670 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73  () calls are dis
1d680 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70  abled for this p
1d690 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ager.  Return FA
1d6a0 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28  LSE.** if fsync(
1d6b0 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20  )s are executed 
1d6c0 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  normally..*/.int
1d6d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6e 6f   sqlite3pager_no
1d6e0 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
1d6f0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1d700 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
1d710 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
1d720 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
1d730 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ger.*/.void sqli
1d740 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64  te3pager_set_cod
1d750 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
1d760 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ger,.  void *(*x
1d770 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
1d780 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20  d*,Pgno,int),.  
1d790 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a  void *pCodecArg.
1d7a0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  ){.  pPager->xCo
1d7b0 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20  dec = xCodec;.  
1d7c0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72  pPager->pCodecAr
1d7d0 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d  g = pCodecArg;.}
1d7e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1d7f0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1d800 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
1d810 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
1d820 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
1d830 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
1d840 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
1d850 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1d860 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
1d870 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
1d880 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76  er *pPager){.  v
1d890 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67  oid *pPage;.  Pg
1d8a0 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75  Hdr *pPgHdr;.  u
1d8b0 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
1d8c0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1d8d0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
1d8e0 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
1d8f0 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  riting. */.  rc 
1d900 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1d910 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
1d920 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1d930 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1d940 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
1d950 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1d960 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1d970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1d980 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
1d990 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e   Read the curren
1d9a0 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20  t value at byte 
1d9b0 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20  24. */.  pPgHdr 
1d9c0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1d9d0 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65  pPage);.  change
1d9e0 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69  _counter = retri
1d9f0 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72  eve32bits(pPgHdr
1da00 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63  , 24);..  /* Inc
1da10 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
1da20 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
1da30 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
1da40 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68  byte 24. */.  ch
1da50 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
1da60 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1da70 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  ar*)PGHDR_TO_DAT
1da80 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63  A(pPgHdr))+24, c
1da90 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1daa0 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68  .  /* Release th
1dab0 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
1dac0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61  . */.  sqlite3pa
1dad0 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
1dae0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1daf0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
1db00 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1db10 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
1db20 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
1db30 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
1db40 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
1db50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1db60 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
1db70 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1db80 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
1db90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
1dba0 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
1dbb0 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
1dbc0 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
1dbd0 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
1dbe0 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
1dbf0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
1dc00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1dc10 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
1dc20 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1dc30 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72   synced, all dir
1dc40 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ty pages written
1dc50 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
1dc60 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
1dc70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1dc80 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20  ynced. The only 
1dc90 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65  thing that.** re
1dca0 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
1dcb0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1dcc0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1dcd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
1dce0 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  r.** master jour
1dcf0 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
1dd00 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
1dd10 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
1dd20 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
1dd30 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
1dd40 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
1dd50 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
1dd60 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  an sqlite3pager_
1dd70 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  sync() call..**.
1dd80 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
1dd90 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65  nTrunc is non-ze
1dda0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ro, then the pag
1ddb0 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  er file is trunc
1ddc0 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e  ated to.** nTrun
1ddd0 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73  c pages (this is
1dde0 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
1ddf0 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e  cuum databases).
1de00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1de10 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20  ager_sync(Pager 
1de20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
1de30 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67  har *zMaster, Pg
1de40 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e  no nTrunc){.  in
1de50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1de60 3b 0a 0a 20 20 54 52 41 43 45 34 28 22 44 41 54  ;..  TRACE4("DAT
1de70 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
1de80 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
1de90 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20  Trunc=%d\n", .  
1dea0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c      pPager->zFil
1deb0 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20  ename, zMaster, 
1dec0 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49  nTrunc);..  /* I
1ded0 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
1dee0 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
1def0 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
1df00 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
1df10 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
1df20 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1df30 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
1df40 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1df50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1df60 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
1df70 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70  D && !MEMDB && p
1df80 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1df90 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
1dfa0 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
1dfb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1dfc0 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Open );..    /* 
1dfd0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1dfe0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
1dff0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
1e000 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
1e010 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1e020 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
1e030 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
1e040 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
1e050 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
1e060 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
1e070 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
1e080 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
1e090 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
1e0a0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
1e0b0 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
1e0c0 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
1e0d0 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
1e0e0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
1e0f0 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
1e100 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
1e110 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1e120 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1e130 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
1e140 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
1e150 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
1e160 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
1e170 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1e180 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1e190 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69  to sync_exit;.#i
1e1a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e1b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1e1c0 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
1e1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
1e1e0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1e1f0 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
1e200 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
1e210 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
1e220 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  .        ** bein
1e230 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
1e240 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
1e250 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
1e260 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
1e270 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20       ** file..  
1e280 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e290 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20   Pgno i;.       
1e2a0 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
1e2b0 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20        int iSkip 
1e2c0 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
1e2d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1e2e0 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31   for( i=nTrunc+1
1e2f0 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  ; i<=pPager->ori
1e300 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  gDbSize; i++ ){.
1e310 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
1e320 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1e330 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69  al[i/8] & (1<<(i
1e340 26 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69  &7))) && i!=iSki
1e350 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  p ){.           
1e360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1e370 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 69  er_get(pPager, i
1e380 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
1e390 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1e3a0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1e3b0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
1e3c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e3d0 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
1e3e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e3f0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
1e400 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
1e410 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1e420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1e430 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1e440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e450 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e    } .      }.#en
1e460 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77  dif.      rc = w
1e470 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
1e480 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
1e490 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1e4a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1e4b0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1e4c0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
1e4d0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1e4e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e4f0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1e500 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23  c_exit;.    }..#
1e510 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e520 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1e530 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
1e540 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1e550 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63  lite3pager_trunc
1e560 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
1e570 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
1e580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1e590 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1e5a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1e5b0 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
1e5c0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
1e5d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1e5e0 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
1e5f0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
1e600 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
1e610 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1e620 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
1e630 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1e640 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1e650 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20  sync_exit;..    
1e660 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  /* Sync the data
1e670 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1e680 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
1e690 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
1e6a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1e6b0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29  c(pPager->fd, 0)
1e6c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
1e6d0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1e6e0 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c  ER_SYNCED;.  }el
1e6f0 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  se if( MEMDB && 
1e700 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1e710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1e720 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1e730 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d  er, nTrunc);.  }
1e740 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72  ..sync_exit:.  r
1e750 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1e760 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e770 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
1e780 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
1e790 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44  identified by pD
1e7a0 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  ata to location 
1e7b0 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
1e7c0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  . .**.** There m
1e7d0 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
1e7e0 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72  nces to the curr
1e7f0 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49  ent page pgno. I
1e800 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a  f current page.*
1e810 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  * pgno is not al
1e820 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c  ready in the rol
1e830 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
1e840 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  t is not written
1e850 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20   there by.** by 
1e860 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68  this routine. Th
1e870 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74  e same applies t
1e880 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61  o the page pData
1e890 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e   refers to on en
1e8a0 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  try to.** this r
1e8b0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
1e8c0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1e8d0 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20  page refered to 
1e8e0 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20  by pData remain 
1e8f0 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
1e900 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
1e910 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e920 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65   page pData (i.e
1e930 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
1e940 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
1e950 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
1e960 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
1e970 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
1e980 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1e990 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
1e9a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
1e9b0 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
1e9c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e9d0 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
1e9e0 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
1e9f0 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
1ea00 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1ea10 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
1ea20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
1ea30 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
1ea40 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
1ea50 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
1ea60 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
1ea70 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
1ea80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1ea90 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
1eaa0 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
1eab0 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
1eac0 65 72 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  er, void *pData,
1ead0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
1eae0 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
1eaf0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
1eb00 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  ;.  PgHdr *pPgOl
1eb10 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50  d; .  int h;.  P
1eb20 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
1eb30 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1eb40 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
1eb50 0a 20 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20  .  TRACE5("MOVE 
1eb60 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
1eb70 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
1eb80 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
1eb90 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1eba0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
1ebb0 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29  >needSync, pgno)
1ebc0 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  ;..  if( pPg->ne
1ebd0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65  edSync ){.    ne
1ebe0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
1ebf0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
1ec00 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1ec10 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
1ec20 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a  ( pPg->dirty );.
1ec30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ec40 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
1ec50 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
1ec60 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
1ec70 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75  ash-chain */.  u
1ec80 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
1ec90 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20  Pager, pPg);..  
1eca0 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
1ecb0 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
1ecc0 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
1ecd0 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
1ece0 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20  .  ** from it's 
1ecf0 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
1ed00 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
1ed10 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
1ed20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
1ed30 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
1ed40 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
1ed50 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
1ed60 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
1ed70 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
1ed80 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
1ed90 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
1eda0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1edb0 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  no);.  if( pPgOl
1edc0 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1edd0 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30   pPgOld->nRef==0
1ede0 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61   );.    unlinkHa
1edf0 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1ee00 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b  pPgOld);.    mak
1ee10 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a  eClean(pPgOld);.
1ee20 20 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e      if( pPgOld->
1ee30 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1ee40 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1ee50 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1ee60 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1ee70 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  nal = 1;.      p
1ee80 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  Pg->needSync = 1
1ee90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1eea0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1eeb0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
1eec0 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70   /* Change the p
1eed0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
1eee0 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  Pg and insert it
1eef0 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61   into the new ha
1ef00 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61  sh-chain. */.  a
1ef10 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
1ef20 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  ;.  pPg->pgno = 
1ef30 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f  pgno;.  h = pgno
1ef40 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
1ef50 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67  h-1);.  if( pPag
1ef60 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a  er->aHash[h] ){.
1ef70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ef80 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
1ef90 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
1efa0 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
1efb0 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
1efc0 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
1efd0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
1efe0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
1eff0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
1f000 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70   = pPg;.  pPg->p
1f010 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20  PrevHash = 0;.. 
1f020 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
1f030 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  .  pPager->dirty
1f040 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66  Cache = 1;..  if
1f050 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
1f060 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
1f070 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
1f080 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
1f090 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
1f0a0 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
1f0b0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
1f0c0 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
1f0d0 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
1f0e0 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
1f0f0 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
1f100 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
1f110 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
1f120 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
1f130 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
1f140 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c  Pager.aInJournal
1f150 20 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65   bit has been se
1f160 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f  t. This needs to
1f170 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20   be remedied by 
1f180 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74  loading.    ** t
1f190 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
1f1a0 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
1f1b0 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
1f1c0 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  dr.needSync flag
1f1d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f1e0 54 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  The sqlite3pager
1f1f0 5f 67 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  _get() call may 
1f200 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  cause the journa
1f210 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61  l to sync. So ma
1f220 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74  ke.    ** sure t
1f230 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
1f240 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  c flag is set to
1f250 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  o..    */.    in
1f260 74 20 72 63 3b 0a 20 20 20 20 76 6f 69 64 20 2a  t rc;.    void *
1f270 70 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20 20 61  pNeedSync;.    a
1f280 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1f290 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72  eedSync );.    r
1f2a0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1f2b0 5f 67 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  _get(pPager, nee
1f2c0 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e 65 65  dSyncPgno, &pNee
1f2d0 64 53 79 6e 63 29 3b 0a 20 20 20 20 69 66 28 20  dSync);.    if( 
1f2e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f2f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
1f300 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1f310 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f  = 1;.    DATA_TO
1f320 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63  _PGHDR(pNeedSync
1f330 29 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  )->needSync = 1;
1f340 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1f350 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 69  DR(pNeedSync)->i
1f360 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
1f370 20 20 6d 61 6b 65 44 69 72 74 79 28 44 41 54 41    makeDirty(DATA
1f380 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53  _TO_PGHDR(pNeedS
1f390 79 6e 63 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ync));.    sqlit
1f3a0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4e  e3pager_unref(pN
1f3b0 65 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20  eedSync);.  }.. 
1f3c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f3d0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
1f3e0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f3f0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1f400 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
1f410 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1f420 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
1f430 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66   the file lock f
1f440 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
1f450 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  er..** The retur
1f460 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f  n value is one o
1f470 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  f NO_LOCK, SHARE
1f480 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
1f490 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e  _LOCK,.** PENDIN
1f4a0 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55  G_LOCK, or EXCLU
1f4b0 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e  SIVE_LOCK..*/.in
1f4c0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c  t sqlite3pager_l
1f4d0 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a  ockstate(Pager *
1f4e0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1f4f0 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53  n sqlite3OsLockS
1f500 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29  tate(pPager->fd)
1f510 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
1f520 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1f530 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
1f540 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
1f550 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
1f560 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
1f570 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1f580 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28  e3pager_refdump(
1f590 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f5a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1f5b0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1f5c0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
1f5d0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
1f5e0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
1f5f0 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
1f600 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
1f610 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  Printf("PAGE %3d
1f620 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
1f630 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
1f640 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f  ->pgno, PGHDR_TO
1f650 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
1f660 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65  >nRef);.  }.}.#e
1f670 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ndif..#endif /* 
1f680 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
1f690 49 4f 20 2a 2f 0a                                IO */.