/ Hex Artifact Content
Login

Artifact e51c079b3cad8394898a6c22330150339103700a:


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: 31 20 32 30 30 36 2f 30 38 2f 30 38 20 31 33 3a  1 2006/08/08 13:
0360: 35 31 3a 34 33 20 64 72 68 20 45 78 70 20 24 0a  51:43 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 65 72 72 43 6f 64 65   */.  u8 errCode
2860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2870: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65    /* One of seve
2880: 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72  ral kinds of err
2890: 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ors */.  u8 temp
28a0: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
28b0: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
28c0: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
28d0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
28e0: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
28f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2900: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
2910: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
2920: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
2930: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2940: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
2950: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
2960: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2970: 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20  dirtyCache;     
2980: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2990: 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73   if cached pages
29a0: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f   have changed */
29b0: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
29c0: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  back;          /
29d0: 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72  * Disable dont_r
29e0: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
29f0: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
2a00: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
2a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a20: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
2a30: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
2a40: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
2a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2a60: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
2a70: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
2a80: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e   to jrnl */.  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 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
4d80: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
4d90: 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 70 50 61 67  ITE_FULL || pPag
4da0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
4db0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
4dc0: 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f  .    rc==SQLITE_
4dd0: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 3d 3d  FULL ||.    rc==
4de0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a  SQLITE_IOERR ||.
4df0: 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43      rc==SQLITE_C
4e00: 4f 52 52 55 50 54 20 7c 7c 0a 20 20 20 20 72 63  ORRUPT ||.    rc
4e10: 3d 3d 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  ==SQLITE_PROTOCO
4e20: 4c 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65  L.  ){.    pPage
4e30: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
4e40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4e50: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
4e60: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f  TE_CHECK_PAGES./
4e70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32  *.** Return a 32
4e80: 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65  -bit hash of the
4e90: 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70   page data for p
4ea0: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
4eb0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
4ec0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
4ed0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
4ee0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
4ef0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
4f00: 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  a = (unsigned ch
4f10: 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  ar *)PGHDR_TO_DA
4f20: 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72  TA(pPage);.  for
4f30: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70  (i=0; i<pPage->p
4f40: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
4f50: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
4f60: 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61  = (hash+i)^pData
4f70: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
4f80: 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n hash;.}../*.**
4f90: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
4fa0: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
4fb0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
4fc0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
4fd0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
4fe0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
4ff0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
5000: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
5010: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
5020: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
5030: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
5040: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
5050: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
5060: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
5070: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
5080: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
5090: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
50a0: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
50b0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
50c0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
50d0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
50e0: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
50f0: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
5100: 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50  e || MEMDB || pP
5110: 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20  g->dirty || .   
5120: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
5130: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
5140: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
5150: 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  e.#define CHECK_
5160: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a  PAGE(x).#endif..
5170: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
5180: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
5190: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
51a0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
51b0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65   be open..** The
51c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
51d0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61  file name is rea
51e0: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  d from the end o
51f0: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a  f the file and .
5200: 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
5210: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
5220: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
5230: 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69  c(). *pzMaster i
5240: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e  s.** set to poin
5250: 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  t at the memory 
5260: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
5270: 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c  turned. The call
5280: 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74  er must.** sqlit
5290: 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65  eFree() *pzMaste
52a0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d  r..**.** If no m
52b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
52c0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
52d0: 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20  nt *pzMaster is 
52e0: 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
52f0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
5300: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
5310: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
5320: 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e  nal(OsFile *pJrn
5330: 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74  l, char **pzMast
5340: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
5350: 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20   u32 len;.  i64 
5360: 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  szJ;.  u32 cksum
5370: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73  ;.  int i;.  uns
5380: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
5390: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
53a0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
53b0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  gic header */.. 
53c0: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
53d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
53e0: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
53f0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
5400: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
5410: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
5420: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5430: 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20  e3OsSeek(pJrnl, 
5440: 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72  szJ-16);.  if( r
5450: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5460: 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63  eturn rc;. .  rc
5470: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5480: 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  rnl, &len);.  if
5490: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
54a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
54b0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
54c0: 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a  pJrnl, &cksum);.
54d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
54e0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
54f0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
5500: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
5510: 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20  agic, 8);.  if( 
5520: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5530: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
5540: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
5550: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5560: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5570: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
5580: 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  16-len);.  if( r
5590: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
55a0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a  eturn rc;..  *pz
55b0: 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a  Master = (char *
55c0: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65  )sqliteMalloc(le
55d0: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a  n+1);.  if( !*pz
55e0: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
55f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5600: 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  M;.  }.  rc = sq
5610: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
5620: 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65  l, *pzMaster, le
5630: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5640: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
5650: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
5660: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
5670: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ter = 0;.    ret
5680: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
5690: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
56a0: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
56b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
56c0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69   name */.  for(i
56d0: 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b  =0; i<len; i++){
56e0: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a  .    cksum -= (*
56f0: 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20  pzMaster)[i];.  
5700: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
5710: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
5720: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
5730: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
5740: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
5750: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
5760: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
5770: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5780: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
5790: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
57a0: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
57b0: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
57c0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
57d0: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
57e0: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
57f0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
5800: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
5810: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72   */.    sqliteFr
5820: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
5830: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
5840: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28  ;.  }else{.    (
5850: 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20  *pzMaster)[len] 
5860: 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a  = '\0';.  }.   .
5870: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5880: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
5890: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
58a0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
58b0: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
58c0: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
58d0: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
58e0: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
58f0: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
5900: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
5910: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
5920: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
5930: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
5940: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
5950: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
5960: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
5970: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
5980: 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  Offset.** ------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59b0: 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20  -.** 0          
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
59d0: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
59f0: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
5a10: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
5a40: 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e  ic int seekJourn
5a50: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
5a60: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
5a70: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
5a80: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
5a90: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
5aa0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
5ab0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
5ac0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
5ad0: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
5ae0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
5af0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
5b00: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5b10: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
5b20: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
5b30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
5b40: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
5b50: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
5b60: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
5b70: 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74  rnalOff = offset
5b80: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
5b90: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
5ba0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
5bb0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a  urnalOff);.}../*
5bc0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
5bd0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
5be0: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
5bf0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
5c00: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
5c10: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
5c20: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
5c30: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
5c40: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
5c50: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
5c60: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
5c70: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
5c80: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
5c90: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
5ca0: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
5cb0: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
5cc0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
5cd0: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
5ce0: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
5cf0: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
5d00: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
5d10: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
5d20: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
5d30: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
5d40: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
5d50: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
5d60: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
5d70: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
5d80: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
5d90: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
5da0: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
5db0: 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  rnal..** .** Fol
5dc0: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
5dd0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62  L_HDR_SZ - 24) b
5de0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
5df0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
5e00: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
5e10: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
5e20: 72 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64  r){.  char zHead
5e30: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
5e40: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 0a 20  alMagic)+16];.. 
5e50: 20 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f   int rc = seekJo
5e60: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
5e70: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
5e80: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65  urn rc;..  pPage
5e90: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
5ea0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5eb0: 66 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ff;.  if( pPager
5ec0: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20  ->stmtHdrOff==0 
5ed0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
5ee0: 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67  tmtHdrOff = pPag
5ef0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a  er->journalHdr;.
5f00: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
5f10: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
5f20: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5f30: 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45  r);..  /* FIX ME
5f40: 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73  : .  **.  ** Pos
5f50: 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65  sibly for a page
5f60: 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  r not in no-sync
5f70: 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
5f80: 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20  al magic should 
5f90: 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74  not.  ** be writ
5fa0: 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69  ten until nRec i
5fb0: 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70  s filled in as p
5fc0: 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63  art of next sync
5fd0: 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a  Journal(). .  **
5fe0: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d  .  ** Actually m
5ff0: 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a  aybe the whole j
6000: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68  ournal header sh
6010: 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20  ould be delayed 
6020: 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20  until that.  ** 
6030: 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f  point. Think abo
6040: 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  ut this..  */.  
6050: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
6060: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
6070: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6080: 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20  gic));.  /* The 
6090: 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46  nRec Field. 0xFF
60a0: 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79  FFFFFF for no-sy
60b0: 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a  nc journals. */.
60c0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
60d0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
60e0: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
60f0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78  ger->noSync ? 0x
6100: 66 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20  ffffffff : 0);. 
6110: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
6120: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
6130: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  liser */ .  sqli
6140: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
6150: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
6160: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
6170: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6180: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6190: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
61a0: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
61b0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
61c0: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
61d0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
61e0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
61f0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6200: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
6210: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
6220: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
6230: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
6240: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
6250: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
6260: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
6270: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
6280: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
6290: 6f 72 53 69 7a 65 29 3b 0a 20 20 72 63 20 3d 20  orSize);.  rc = 
62a0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
62b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
62c0: 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
62d0: 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  der));..  /* The
62e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
62f0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
6300: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53   successfully. S
6310: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  eek the journal.
6320: 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
6330: 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  ptor to the end 
6340: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
6350: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
6360: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
6370: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
6380: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
6390: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
63a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
63b0: 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  -1);.    if( rc=
63c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
63d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
63e0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
63f0: 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b  jfd, "\000", 1);
6400: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6410: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6420: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
6430: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
6440: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
6450: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
6460: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
6470: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
6480: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
6490: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
64a0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
64b0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
64c0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
64d0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
64e0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
64f0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
6500: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
6510: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
6520: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
6530: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
6540: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
6550: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
6560: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
6570: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
6580: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
6590: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
65a0: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
65b0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
65c0: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
65d0: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
65e0: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
65f0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
6600: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
6610: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
6620: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
6630: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
6640: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
6650: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
6660: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
6670: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
6680: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
6690: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
66a0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
66b0: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
66c0: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
66d0: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
66e0: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
66f0: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
6700: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
6710: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
6720: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
6730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
6740: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
6750: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
6760: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
6770: 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  ,.  u32 *pNRec, 
6780: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a  .  u32 *pDbSize.
6790: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
67a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
67b0: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
67c0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
67d0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
67e0: 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  .  rc = seekJour
67f0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
6800: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6810: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  n rc;..  if( pPa
6820: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
6830: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6840: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
6850: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
6860: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
6870: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
6880: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
6890: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
68a0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a  izeof(aMagic));.
68b0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
68c0: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  n rc;..  if( mem
68d0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
68e0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
68f0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
6900: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6910: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
6920: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6930: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52  pPager->jfd, pNR
6940: 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ec);.  if( rc ) 
6950: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6960: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
6970: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
6980: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
6990: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
69a0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
69b0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
69c0: 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a  >jfd, pDbSize);.
69d0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
69e0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  n rc;..  /* Upda
69f0: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
6a00: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
6a10: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
6a20: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20  ed by .  ** the 
6a30: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
6a40: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
6a50: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
6a60: 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61  al was.  ** crea
6a70: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
6a80: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
6a90: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
6aa0: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
6ab0: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
6ac0: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
6ad0: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
6ae0: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ocal value.  ** 
6af0: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
6b00: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
6b10: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
6b20: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  at routine..  */
6b30: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6b40: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6b50: 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e  (u32 *)&pPager->
6b60: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
6b70: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6b80: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
6b90: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
6ba0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6bb0: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
6bc0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
6bd0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
6be0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74  urnalOff);.  ret
6bf0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
6c00: 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
6c10: 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
6c20: 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
6c30: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
6c40: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
6c50: 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
6c60: 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
6c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6c80: 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
6c90: 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
6ca0: 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
6cb0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
6cc0: 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
6cd0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
6ce0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
6cf0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
6d00: 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
6d10: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
6d20: 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
6d30: 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
6d40: 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
6d50: 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  .**.** + 4 bytes
6d60: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
6d70: 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c  .** + N bytes: l
6d80: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
6d90: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
6da0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a   + 4 bytes: N.**
6db0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
6dc0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
6dd0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38  checksum..** + 8
6de0: 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
6df0: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
6e00: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6e10: 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
6e20: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
6e30: 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
6e40: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
6e50: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
6e60: 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
6e70: 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
6e80: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
6e90: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
6ea0: 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
6eb0: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
6ec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
6ed0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
6ee0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6ef0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
6f00: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
6f10: 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e    int len; .  in
6f20: 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75  t i; .  u32 cksu
6f30: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
6f40: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
6f50: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
6f60: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
6f70: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
6f80: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
6f90: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
6fa0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
6fb0: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
6fc0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
6fd0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
6fe0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
6ff0: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
7000: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
7010: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
7020: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
7030: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
7040: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
7050: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7060: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
7070: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
7080: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
7090: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
70a0: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
70b0: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
70c0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
70d0: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
70e0: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
70f0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
7100: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7110: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
7120: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
7130: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c  journalOff += (l
7140: 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20  en+20);..  rc = 
7150: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
7160: 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d  er->jfd, PAGER_M
7170: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
7180: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7190: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
71a0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
71b0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
71c0: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  >jfd, zMaster, l
71d0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
71e0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
71f0: 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69  n rc;..  put32bi
7200: 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20  ts(zBuf, len);. 
7210: 20 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66   put32bits(&zBuf
7220: 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d  [4], cksum);.  m
7230: 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20  emcpy(&zBuf[8], 
7240: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
7250: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7260: 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  gic));.  rc = sq
7270: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
7280: 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20  ger->jfd, zBuf, 
7290: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
72a0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67  lMagic));.  pPag
72b0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
72c0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
72d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
72e0: 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d  /*.** Add or rem
72f0: 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ove a page from 
7300: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
7310: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69  pages that are i
7320: 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65  n the.** stateme
7330: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
7340: 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70  * The Pager keep
7350: 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73  s a separate lis
7360: 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  t of pages that 
7370: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
7380: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e  .** the statemen
7390: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73  t journal.  This
73a0: 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74   helps the sqlit
73b0: 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
73c0: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
73d0: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
73e0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
73f0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
7400: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
7410: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
7420: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
7430: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
7440: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
7450: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
7460: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
7470: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
7480: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
7490: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
74a0: 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72   pPg->inStmt ) r
74b0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
74c0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d   pPg->pPrevStmt=
74d0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74  =0 && pPg->pNext
74e0: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67  Stmt==0 );.  pPg
74f0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
7500: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
7510: 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67  Stmt ){.    pPag
7520: 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76  er->pStmt->pPrev
7530: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Stmt = pPg;.  }.
7540: 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74    pPg->pNextStmt
7550: 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74   = pPager->pStmt
7560: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  ;.  pPager->pStm
7570: 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  t = pPg;.  pPg->
7580: 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74  inStmt = 1;.}.st
7590: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
75a0: 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f  emove_from_stmt_
75b0: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
75c0: 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  {.  if( !pPg->in
75d0: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
75e0: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53   if( pPg->pPrevS
75f0: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
7600: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
7610: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50  t->pNextStmt==pP
7620: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
7630: 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74  revStmt->pNextSt
7640: 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
7650: 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tmt;.  }else{.  
7660: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7670: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50  Pager->pStmt==pP
7680: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
7690: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
76a0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
76b0: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
76c0: 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  xtStmt ){.    as
76d0: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
76e0: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d  Stmt->pPrevStmt=
76f0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
7700: 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65  >pNextStmt->pPre
7710: 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72  vStmt = pPg->pPr
7720: 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50  evStmt;.  }.  pP
7730: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
7740: 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74  ;.  pPg->pPrevSt
7750: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69  mt = 0;.  pPg->i
7760: 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nStmt = 0;.}../*
7770: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
7780: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
7790: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
77a0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
77b0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
77c0: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
77d0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
77e0: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
77f0: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
7800: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
7810: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
7820: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65   *p;.  if( pPage
7830: 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65  r->aHash==0 ) re
7840: 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50  turn 0;.  p = pP
7850: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
7860: 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
7870: 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  h-1)];.  while( 
7880: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
7890: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
78a0: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
78b0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
78c0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
78d0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65  database and cle
78e0: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
78f0: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
7900: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
7910: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
7920: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
7930: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
7940: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
7950: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
7960: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
7970: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
7980: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
7990: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
79a0: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
79b0: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
79c0: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
79d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
79e0: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
79f0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
7a00: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
7a10: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
7a20: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
7a30: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
7a40: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
7a50: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  g=pNext){.    pN
7a60: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
7a70: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
7a80: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
7a90: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
7aa0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
7ab0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a  irstSynced = 0;.
7ac0: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
7ad0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
7ae0: 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  All = 0;.  pPage
7af0: 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20  r->nHash = 0;.  
7b00: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
7b10: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
7b20: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
7b30: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
7b40: 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
7b50: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
7b60: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
7b70: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
7b80: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
7b90: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e   }.  sqlite3OsUn
7ba0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
7bb0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61   NO_LOCK);.  pPa
7bc0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
7bd0: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  ER_UNLOCK;.  pPa
7be0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
7bf0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
7c00: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7c10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7c20: 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  pen==0 );.}../*.
7c30: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
7c40: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
7c50: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
7c60: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7c70: 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53  pen and.** a RES
7c80: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
7c90: 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
7ca0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
7cb0: 6f 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a  outine releases.
7cc0: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
7cd0: 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65  lock and acquire
7ce0: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  s a SHARED lock 
7cf0: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54  in its place.  T
7d00: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
7d10: 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e  le is deleted an
7d20: 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  d closed..**.** 
7d30: 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b  TODO: Consider k
7d40: 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eeping the journ
7d50: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72  al file open for
7d60: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
7d70: 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69  ases..** This mi
7d80: 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
7d90: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
7da0: 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68  nt on windows wh
7db0: 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61  ere opening.** a
7dc0: 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65   file is an expe
7dd0: 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e  nsive operation.
7de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7df0: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
7e00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7e10: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
7e20: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
7e30: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
7e40: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
7e50: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
7e60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7e70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73  LITE_OK;.  }.  s
7e80: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
7e90: 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
7ea0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
7eb0: 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  tmtOpen ){.    s
7ec0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
7ed0: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
7ee0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
7ef0: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  en = 0;.  }.  if
7f00: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
7f10: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
7f20: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
7f30: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70  ger->jfd);.    p
7f40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
7f50: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  en = 0;.    sqli
7f60: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
7f70: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
7f80: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
7f90: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
7fa0: 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
7fb0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
7fc0: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
7fd0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
7fe0: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
7ff0: 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  l){.      pPg->i
8000: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
8010: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
8020: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
8030: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 23 69 66  eedSync = 0;.#if
8040: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
8050: 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
8060: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
8070: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
8080: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
8090: 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
80a0: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
80b0: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
80c0: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
80d0: 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Rec = 0;.  }else
80e0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
80f0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
8100: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
8110: 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  t( pPager->dirty
8120: 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67  Cache==0 || pPag
8130: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d  er->useJournal==
8140: 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  0 );.  }.  rc = 
8150: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
8160: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
8170: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  ED_LOCK);.  pPag
8180: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
8190: 52 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67  R_SHARED;.  pPag
81a0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
81b0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
81c0: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
81d0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
81e0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
81f0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
8200: 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
8210: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8220: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  .** Compute and 
8230: 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
8240: 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f  m for the page o
8250: 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  f data..**.** Th
8260: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
8270: 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69   checksum.  It i
8280: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
8290: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
82a0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
82b0: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61  value and the pa
82c0: 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65  ge number.  We e
82d0: 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68  xperimented with
82e0: 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f  .** a checksum o
82f0: 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74  f the entire dat
8300: 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20  a, but that was 
8310: 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20  found to be too 
8320: 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  slow..**.** Note
8330: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
8340: 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20  umber is stored 
8350: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
8360: 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20   of data and.** 
8370: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  the checksum is 
8380: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
8390: 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f  d.  This is impo
83a0: 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e  rtant.  If journ
83b0: 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  al.** corruption
83c0: 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
83d0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
83e0: 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
83f0: 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74  scenario.** is t
8400: 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
8410: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
8420: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
8430: 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a  hanged.  It is.*
8440: 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  * much less like
8450: 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
8460: 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
8470: 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
8480: 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
8490: 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
84a0: 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
84b0: 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
84c0: 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
84d0: 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
84e0: 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
84f0: 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
8500: 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
8510: 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20  .**.** FIX ME:  
8520: 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  Consider adding 
8530: 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20  every 200th (or 
8540: 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20  so) byte of the 
8550: 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63  data to the.** c
8560: 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77  hecksum.  That w
8570: 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70  ay if a single p
8580: 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d  age spans 3 or m
8590: 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  ore disk sectors
85a0: 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65   and.** only the
85b0: 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69   middle sector i
85c0: 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69  s corrupt, we wi
85d0: 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20  ll still have a 
85e0: 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68  reasonable.** ch
85f0: 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20  ance of failing 
8600: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64  the checksum and
8610: 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20   thus detecting 
8620: 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  the problem..*/.
8630: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
8640: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
8650: 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a  ager, const u8 *
8660: 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
8670: 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
8680: 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69  sumInit;.  int i
8690: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
86a0: 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65  ize-200;.  while
86b0: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
86c0: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
86d0: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
86e0: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
86f0: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
8700: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
8710: 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
8720: 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f  lean(PgHdr*);../
8730: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
8740: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  le page from the
8750: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
8760: 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73  ened on file des
8770: 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20  criptor.** jfd. 
8780: 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f   Playback this o
8790: 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  ne page..**.** I
87a0: 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74  f useCksum==0 it
87b0: 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72   means this jour
87c0: 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  nal does not use
87d0: 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65   checksums.  Che
87e0: 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f  cksums.** are no
87f0: 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d  t used in statem
8800: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63  ent journals bec
8810: 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a  ause statement j
8820: 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a  ournals do not.*
8830: 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76  * need to surviv
8840: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  e power failures
8850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8860: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
8870: 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70  ne_page(Pager *p
8880: 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a  Pager, OsFile *j
8890: 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d  fd, int useCksum
88a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
88b0: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
88d0: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
88e0: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
88f0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
8920: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
8930: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
8940: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
8950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8960: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
8970: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8980: 20 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53   */.  u8 aData[S
8990: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
89a0: 49 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73  IZE];  /* Temp s
89b0: 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67  torage for a pag
89c0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b  e */..  /* useCk
89d0: 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72  sum should be tr
89e0: 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  ue for the main 
89f0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73  journal and fals
8a00: 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  e for.  ** state
8a10: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20  ment journals.  
8a20: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
8a30: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63   is always the c
8a40: 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ase.  */.  asser
8a50: 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b  t( jfd == (useCk
8a60: 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  sum ? pPager->jf
8a70: 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64  d : pPager->stfd
8a80: 29 20 29 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65  ) );...  rc = re
8a90: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70  ad32bits(jfd, &p
8aa0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
8ab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
8ac0: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
8ad0: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
8ae0: 20 26 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d   &aData, pPager-
8af0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
8b00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8b10: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
8b20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8b30: 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
8b40: 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a  eSize + 4;..  /*
8b50: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
8b60: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
8b70: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
8b80: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
8b90: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
8ba0: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
8bb0: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
8bc0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8bd0: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
8be0: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
8bf0: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
8c00: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
8c10: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
8c20: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
8c30: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
8c40: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
8c50: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
8c60: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
8c70: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
8c80: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
8c90: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
8ca0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
8cb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
8cc0: 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
8cd0: 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61  no>(unsigned)pPa
8ce0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
8cf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8d00: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75  _OK;.  }.  if( u
8d10: 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72  seCksum ){.    r
8d20: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
8d30: 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  fd, &cksum);.   
8d40: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
8d50: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
8d60: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
8d70: 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f  ;.    if( pager_
8d80: 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44  cksum(pPager, aD
8d90: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
8da0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8db0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
8dc0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
8dd0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
8de0: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
8df0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
8e00: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
8e10: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
8e20: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
8e30: 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ED state, then t
8e40: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
8e50: 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
8e60: 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
8e70: 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
8e80: 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
8e90: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
8ea0: 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
8eb0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
8ec0: 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
8ed0: 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
8ee0: 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
8ef0: 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c  .  ** If in EXCL
8f00: 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65  USIVE state, the
8f10: 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20  n we update the 
8f20: 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
8f30: 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e  t exists.  ** an
8f40: 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
8f50: 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
8f60: 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72  n marked not dir
8f70: 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  ty..  **.  ** Ti
8f80: 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
8f90: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8fa0: 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
8fb0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
8fc0: 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
8fd0: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
8fe0: 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
8ff0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
9000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
9010: 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
9020: 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
9030: 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
9040: 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
9050: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
9060: 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
9070: 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
9080: 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
9090: 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
90a0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
90b0: 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
90c0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
90d0: 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
90e0: 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
90f0: 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
9100: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
9110: 6e 74 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d  nts are in the m
9120: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
9130: 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
9140: 72 77 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c  rwise, if a full
9150: 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73   ROLLBACK occurs
9160: 20 61 66 74 65 72 20 74 68 65 20 73 74 61 74 65   after the state
9170: 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  ment.  ** rollba
9180: 63 6b 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c  ck the full ROLL
9190: 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65  BACK will not re
91a0: 73 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 74  store the page t
91b0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  o its original. 
91c0: 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77   ** content.  Tw
91d0: 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
91e0: 74 20 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20  t be met before 
91f0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
9200: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c  atabase.  ** fil
9210: 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
9220: 62 61 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63  base must be loc
9230: 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
9240: 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
9250: 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f  nal.  ** page co
9260: 6e 74 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20  ntent is in the 
9270: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
9280: 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
9290: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20  page is not in. 
92a0: 20 2a 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73   ** cache or els
92b0: 65 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61  e it is marked a
92c0: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
92d0: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
92e0: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
92f0: 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74   pgno);.  assert
9300: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
9310: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
9320: 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20 20   || pPg!=0 );.  
9330: 54 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b  TRACE3("PLAYBACK
9340: 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
9350: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
9360: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
9370: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
9380: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
9390: 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  (pPg==0 || pPg->
93a0: 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a  needSync==0) ){.
93b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
93c0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
93d0: 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
93e0: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
93f0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
9400: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9410: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9420: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
9430: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
9440: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9450: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20 29   }.    if( pPg )
9460: 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  {.      makeClea
9470: 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
9480: 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
9490: 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
94a0: 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
94b0: 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
94c0: 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
94d0: 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
94e0: 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
94f0: 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
9500: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
9510: 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
9520: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
9530: 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
9540: 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
9550: 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
9560: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
9570: 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
9580: 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
9590: 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
95a0: 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
95b0: 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
95c0: 72 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  rollback()..    
95d0: 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
95e0: 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  ta;.    /* asser
95f0: 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  t( pPg->nRef==0 
9600: 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20  || pPg->pgno==1 
9610: 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20  ); */.    pData 
9620: 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
9630: 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  pPg);.    memcpy
9640: 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70  (pData, aData, p
9650: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9660: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
9670: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
9680: 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20    /*** FIX ME:  
9690: 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78  Should this be x
96a0: 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20  Reinit? ***/.   
96b0: 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
96c0: 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50  ructor(pData, pP
96d0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
96e0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
96f0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
9700: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
9710: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
9720: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
9730: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
9740: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
9750: 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20  pgno, 3);.  }.  
9760: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9770: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
9780: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
9790: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
97a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
97b0: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
97c0: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
97d0: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
97e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
97f0: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
9800: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
9810: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
9820: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
9830: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
9840: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9850: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
9860: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
9870: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
9890: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
98a0: 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72  f all child jour
98b0: 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c  nals..** To tell
98c0: 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   if a master jou
98d0: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
98e0: 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61  ted, check to ea
98f0: 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69  ch of the.** chi
9900: 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63  ldren.  If all c
9910: 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68  hildren are eith
9920: 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f  er missing or do
9930: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a   not refer to.**
9940: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73   a different mas
9950: 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ter journal, the
9960: 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f  n this master jo
9970: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
9980: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
9990: 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
99a0: 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
99b0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
99c0: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
99d0: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46  _open = 0;.  OsF
99e0: 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b  ile *master = 0;
99f0: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
9a00: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
9a10: 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
9a20: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9a30: 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
9a40: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
9a50: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
9a60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
9a70: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
9a80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9a90: 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20  ile exclusively 
9aa0: 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68  in case some oth
9ab0: 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20  er process.  ** 
9ac0: 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20  is running this 
9ad0: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f  routine also. No
9ae0: 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20  t that it makes 
9af0: 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65  too much differe
9b00: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  nce..  */.  rc =
9b10: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
9b20: 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20  adOnly(zMaster, 
9b30: 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20  &master);.  if( 
9b40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9b50: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
9b60: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
9b70: 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  n = 1;.  rc = sq
9b80: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
9b90: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
9ba0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
9bb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9bc0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
9bd0: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
9be0: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
9bf0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
9c00: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
9c10: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
9c20: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
9c30: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
9c40: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
9c50: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
9c60: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
9c70: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
9c80: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
9c90: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
9ca0: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
9cb0: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
9cc0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
9cd0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
9ce0: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
9cf0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
9d00: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
9d10: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
9d20: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
9d30: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9d40: 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20  3OsRead(master, 
9d50: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
9d60: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
9d70: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
9d80: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
9d90: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
9da0: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
9db0: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
9dc0: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
9dd0: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
9de0: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
9df0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
9e00: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
9e10: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
9e20: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9e30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
9e40: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
9e50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
9e60: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
9e70: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
9e80: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
9e90: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
9ea0: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
9eb0: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
9ec0: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
9ed0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
9ee0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
9ef0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
9f00: 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20  File *journal = 
9f10: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  0;.        int c
9f20: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
9f30: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
9f40: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
9f50: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
9f60: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
9f70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
9f80: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
9f90: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
9fa0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
9fb0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
9fc0: 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65  journal, &zMaste
9fd0: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
9fe0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a  qlite3OsClose(&j
9ff0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
a000: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a010: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
a020: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a030: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
a040: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
a050: 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72 63  erPtr!=0 && strc
a060: 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
a070: 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
a080: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
a090: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
a0a0: 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
a0b0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
a0c0: 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
a0d0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
a0e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a0f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
a100: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a110: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
a120: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
a130: 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a  nal += (strlen(z
a140: 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20  Journal)+1);.   
a150: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69   }.  }.  .  sqli
a160: 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73  te3OsDelete(zMas
a170: 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  ter);..delmaster
a180: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73  _out:.  if( zMas
a190: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
a1a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
a1b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
a1c0: 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72  }  .  if( master
a1d0: 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  _open ){.    sql
a1e0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73  ite3OsClose(&mas
a1f0: 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
a200: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a210: 4d 61 6b 65 20 65 76 65 72 79 20 70 61 67 65 20  Make every page 
a220: 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 67 72  in the cache agr
a230: 65 65 20 77 69 74 68 20 77 68 61 74 20 69 73 20  ee with what is 
a240: 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68  on disk.  In oth
a250: 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72  er words,.** rer
a260: 65 61 64 20 74 68 65 20 64 69 73 6b 20 74 6f 20  ead the disk to 
a270: 72 65 73 65 74 20 74 68 65 20 73 74 61 74 65 20  reset the state 
a280: 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  of the cache..**
a290: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a2a0: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
a2b0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77   a rollback in w
a2c0: 68 69 63 68 20 73 6f 6d 65 20 6f 66 20 74 68 65  hich some of the
a2d0: 20 64 69 72 74 79 20 63 61 63 68 65 0a 2a 2a 20   dirty cache.** 
a2e0: 70 61 67 65 73 20 68 61 64 20 6e 65 76 65 72 20  pages had never 
a2f0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f 75 74  been written out
a300: 20 74 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e 65   to disk.  We ne
a310: 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
a320: 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e  the.** cache con
a330: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 65 61 73  tent and the eas
a340: 69 65 73 74 20 77 61 79 20 74 6f 20 64 6f 20 74  iest way to do t
a350: 68 61 74 20 69 73 20 74 6f 20 72 65 72 65 61 64  hat is to reread
a360: 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74   the old content
a370: 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  .** back from th
a380: 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e disk..*/.stati
a390: 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f  c int pager_relo
a3a0: 61 64 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  ad_cache(Pager *
a3b0: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
a3c0: 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
a3d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66  = SQLITE_OK;.  f
a3e0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
a3f0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
a400: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
a410: 20 20 63 68 61 72 20 7a 42 75 66 5b 53 51 4c 49    char zBuf[SQLI
a420: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
a430: 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  ];.    if( !pPg-
a440: 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75  >dirty ) continu
a450: 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  e;.    if( (int)
a460: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
a470: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
a480: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
a490: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
a4a0: 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
a4b0: 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70  pageSize*(i64)(p
a4c0: 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20  Pg->pgno-1));.  
a4d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a4e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a4f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a500: 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
a510: 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
a520: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
a530: 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52  .      TRACE3("R
a540: 45 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  EFETCH %d page %
a550: 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
a560: 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
a570: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
a580: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43  ) break;.      C
a590: 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 7a 42  ODEC1(pPager, zB
a5a0: 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32  uf, pPg->pgno, 2
a5b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a5c0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c      memset(zBuf,
a5d0: 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
a5e0: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
a5f0: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
a600: 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66  0 || memcmp(zBuf
a610: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
a620: 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
a630: 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20  geSize) ){.     
a640: 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
a650: 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66  _DATA(pPg), zBuf
a660: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a670: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ze);.      if( p
a680: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
a690: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
a6a0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47  er->xReiniter(PG
a6b0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a6c0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a6d0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
a6e0: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
a6f0: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
a700: 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
a710: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
a720: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a730: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
a740: 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  c = 0;.    pPg->
a750: 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
a760: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
a770: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
a780: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
a790: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
a7a0: 6e 64 69 66 0a 20 20 7d 0a 20 20 70 50 61 67 65  ndif.  }.  pPage
a7b0: 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
a7c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a7d0: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
a7e0: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
a7f0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
a800: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
a810: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
a820: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a830: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
a840: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a850: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  int nPage){.  as
a860: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
a870: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
a880: 53 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  SIVE );.  return
a890: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
a8a0: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
a8b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
a8c0: 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a  (i64)nPage);.}..
a8d0: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
a8e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
a8f0: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
a900: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
a910: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
a920: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
a930: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
a940: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
a950: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
a960: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
a970: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
a980: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
a990: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
a9a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
a9b0: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
a9c0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
a9d0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
a9e0: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
a9f0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
aa00: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
aa10: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
aa20: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
aa30: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
aa40: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
aa50: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
aa60: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
aa70: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
aa80: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
aa90: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
aaa0: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
aab0: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
aac0: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
aad0: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
aae0: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
aaf0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
ab00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
ab10: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
ab20: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
ab30: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
ab40: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
ab50: 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  5)  4 byte integ
ab60: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
ab70: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
ab80: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
ab90: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
aba0: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
abb0: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
abc0: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
abd0: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
abe0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
abf0: 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65  .**  (6)  N byte
ac00: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
ac10: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
ac20: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
ac30: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
ac40: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
ac50: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
ac60: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
ac70: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
ac80: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
ac90: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
aca0: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
acb0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
acc0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
acd0: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
ace0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
acf0: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
ad00: 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20  ..**  (7)  Zero 
ad10: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
ad20: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
ad30: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
ad40: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
ad50: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
ad60: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
ad70: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
ad80: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
ad90: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
ada0: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
adb0: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
adc0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
add0: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
ade0: 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 6 items above.
adf0: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
ae00: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
ae10: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
ae20: 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 7th item..**
ae30: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
ae40: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
ae50: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
ae60: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
ae70: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
ae80: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
ae90: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
aea0: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
aeb0: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
aec0: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
aed0: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
aee0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
aef0: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
af00: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
af10: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
af20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
af30: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
af40: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
af50: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
af60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
af70: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
af80: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
af90: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
afa0: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
afb0: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
afc0: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
afd0: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
afe0: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
aff0: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
b000: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
b010: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
b020: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
b030: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
b040: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
b050: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
b060: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
b070: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
b080: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
b090: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
b0a0: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
b0b0: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
b0c0: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
b0d0: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
b0e0: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
b0f0: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
b100: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
b110: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
b120: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
b130: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
b140: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
b150: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
b160: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
b170: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
b180: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
b190: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
b1a0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
b1b0: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
b1c0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
b1d0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
b1e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b1f0: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
b200: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
b210: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
b220: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
b230: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
b240: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
b250: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
b260: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
b270: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
b280: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
b290: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
b2a0: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
b2b0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
b2c0: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
b2d0: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
b2e0: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
b2f0: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
b300: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
b310: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
b320: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
b330: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
b340: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
b350: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
b360: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
b370: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
b380: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b390: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
b3a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b3b0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
b3c0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
b3d0: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b3f0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
b400: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
b410: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
b440: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
b450: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
b460: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
b470: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
b480: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
b4b0: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
b4c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
b4d0: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
b4e0: 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
b4f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
b500: 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
b510: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
b520: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
b530: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
b540: 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
b550: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
b560: 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
b570: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b580: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
b590: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
b5a0: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
b5b0: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
b5c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b5d0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
b5e0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
b5f0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
b600: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
b610: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
b620: 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
b630: 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
b640: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b650: 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
b660: 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
b670: 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
b680: 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
b690: 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
b6a0: 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
b6b0: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
b6c0: 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
b6d0: 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
b6e0: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
b6f0: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
b700: 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73   &zMaster);.  as
b710: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
b720: 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
b730: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
b740: 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c  (zMaster && !sql
b750: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
b760: 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20  (zMaster)) ){.  
b770: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
b780: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
b790: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
b7a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
b7b0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
b7c0: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
b7d0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73  layback;.  }.  s
b7e0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
b7f0: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
b800: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b810: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
b820: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
b830: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
b840: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
b850: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
b860: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
b870: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
b880: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
b890: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
b8a0: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
b8b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
b8c0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
b8d0: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
b8e0: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
b8f0: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
b900: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b910: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
b920: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
b930: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
b940: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
b950: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
b960: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
b970: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
b980: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
b990: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
b9a0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
b9b0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
b9c0: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
b9d0: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
b9e0: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
b9f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ba00: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
ba10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
ba20: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
ba30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
ba40: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
ba50: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
ba60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
ba70: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
ba80: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
ba90: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
baa0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
bab0: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
bac0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
bad0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
bae0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
baf0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
bb00: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
bb10: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
bb20: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
bb30: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
bb40: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
bb50: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
bb60: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
bb70: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
bb80: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
bb90: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
bba0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
bbb0: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
bbc0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
bbd0: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
bbe0: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
bbf0: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
bc00: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
bc10: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
bc20: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
bc30: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
bc40: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
bc50: 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
bc60: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
bc70: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
bc80: 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69  it's original si
bc90: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
bca0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
bcb0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
bcc0: 45 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  E && .        pP
bcd0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bce0: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
bcf0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
bd00: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
bd10: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
bd20: 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  || pPager->origD
bd30: 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20  bSize==mxPg );. 
bd40: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
bd50: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
bd60: 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
bd70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bd80: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
bd90: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
bda0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
bdb0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
bdc0: 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
bdd0: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
bde0: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
bdf0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
be00: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
be10: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
be20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
be30: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Rec; i++){.     
be40: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
be50: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
be60: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
be70: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  d, 1);.      if(
be80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
be90: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
bea0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
beb0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
bec0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
bed0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
bee0: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
bef0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bf00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
bf10: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
bf20: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
bf30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bf40: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
bf50: 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
bf60: 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
bf70: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
bf80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bf90: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
bfa0: 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
bfb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73  ;.  }.  if( zMas
bfc0: 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ter ){.    /* If
bfd0: 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
bfe0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
bff0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
c000: 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20  l return true,. 
c010: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
c020: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
c030: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
c040: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
c050: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c060: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c070: 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
c080: 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20  ster(zMaster);. 
c090: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
c0a0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
c0b0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
c0c0: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
c0d0: 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
c0e0: 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
c0f0: 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
c100: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
c110: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
c120: 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
c130: 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52  ent PAGER_SECTOR
c140: 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65  _SIZE.  ** value
c150: 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
c160: 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
c170: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
c180: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
c190: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41  >sectorSize = PA
c1a0: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  GER_SECTOR_SIZE;
c1b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c1c0: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
c1d0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
c1e0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
c1f0: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
c200: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
c210: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
c220: 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a  rnal but with.**
c230: 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69   a few extra twi
c240: 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  sts..**.**    (1
c250: 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  )  The number of
c260: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
c270: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
c280: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20  he start of.**  
c290: 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65         the state
c2a0: 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  ment is stored i
c2b0: 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  n pPager->stmtSi
c2c0: 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
c2d0: 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
c2e0: 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
c2f0: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
c300: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
c310: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61  ing back the sta
c320: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20  tement journal, 
c330: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  also.**         
c340: 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67  playback all pag
c350: 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  es of the transa
c360: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65  ction journal be
c370: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ginning.**      
c380: 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61     at offset pPa
c390: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a  ger->stmtJSize..
c3a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
c3b0: 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
c3c0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
c3d0: 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c3f0: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
c400: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
c410: 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20  4 hdrOff;.  int 
c420: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
c430: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c440: 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  f Records */.  i
c450: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
c460: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
c470: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
c480: 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50   rc;..  szJ = pP
c490: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c4a0: 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
c4b0: 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73   .  {.    i64 os
c4c0: 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73  _szJ;.    rc = s
c4d0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
c4e0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f  (pPager->jfd, &o
c4f0: 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20  s_szJ);.    if( 
c500: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
c510: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61  return rc;.    a
c520: 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73  ssert( szJ==os_s
c530: 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  zJ );.  }.#endif
c540: 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66  ..  /* Set hdrOf
c550: 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73  f to be the offs
c560: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
c570: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
c580: 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  ritten.  ** this
c590: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
c5a0: 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65  action, or the e
c5b0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
c5c0: 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  f no journal.  *
c5d0: 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  * header was wri
c5e0: 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  tten..  */.  hdr
c5f0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
c600: 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65  mtHdrOff;.  asse
c610: 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
c620: 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20  Sync || !hdrOff 
c630: 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66  );.  if( !hdrOff
c640: 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d   ){.    hdrOff =
c650: 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   szJ;.  }.  .  /
c660: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
c670: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
c680: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
c690: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
c6a0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
c6b0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
c6c0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
c6d0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
c6e0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
c6f0: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
c700: 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
c710: 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f  ->stmtSize;..  /
c720: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
c730: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
c740: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
c750: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
c760: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c770: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
c780: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c790: 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  pen );.  sqlite3
c7a0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73  OsSeek(pPager->s
c7b0: 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20  tfd, 0);.  nRec 
c7c0: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
c7d0: 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
c7e0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
c7f0: 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  out of the state
c800: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ment journal and
c810: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
c820: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
c830: 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
c840: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
c850: 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73  nal omits checks
c860: 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61  ums from.  ** ea
c870: 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20  ch record since 
c880: 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65  power-failure re
c890: 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d  covery is not im
c8a0: 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65  portant to state
c8b0: 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ment.  ** journa
c8c0: 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
c8d0: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
c8e0: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
c8f0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
c900: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
c910: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
c920: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
c930: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
c940: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c950: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
c960: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
c970: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c   }..  /* Now rol
c980: 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63  l some pages bac
c990: 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73  k from the trans
c9a0: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20  action journal. 
c9b0: 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a  Pager.stmtJSize.
c9c0: 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a    ** was the siz
c9d0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c9e0: 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
c9f0: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
ca00: 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65  arted, so.  ** e
ca10: 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20  verything after 
ca20: 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
ca30: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69   rolled back, ei
ca40: 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ther into the.  
ca50: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
ca60: 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f   memory cache, o
ca70: 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a  r both..  **.  *
ca80: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a  * If it is not z
ca90: 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ero, then Pager.
caa0: 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68  stmtHdrOff is th
cab0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
cac0: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
cad0: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
cae0: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64  header written d
caf0: 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65  uring this state
cb00: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
cb10: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
cb20: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
cb30: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
cb40: 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
cb50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cb60: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
cb70: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
cb80: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
cb90: 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65  urnalOff = pPage
cba0: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20  r->stmtJSize;.  
cbb0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
cbc0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
cbd0: 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28  Cksum;.  assert(
cbe0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
cbf0: 70 50 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d  pPager)<(pPager-
cc00: 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a  >pageSize+8) );.
cc10: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
cc20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28  >journalOff <= (
cc30: 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e  hdrOff-(pPager->
cc40: 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a  pageSize+8)) ){.
cc50: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
cc60: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
cc70: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
cc80: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73  >jfd, 1);.    as
cc90: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
cca0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
ccb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ccc0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
ccd0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
cce0: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
ccf0: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20  ournalOff < szJ 
cd00: 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  ){.    u32 nJRec
cd10: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
cd20: 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
cd30: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
cd40: 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
cd50: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
cd60: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
cd70: 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
cd80: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
cd90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
cda0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
cdb0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67  _DONE );.      g
cdc0: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
cdd0: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  yback;.    }.   
cde0: 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b   if( nJRec==0 ){
cdf0: 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
ce00: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
ce10: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61  urnalOff) / (pPa
ce20: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
ce30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
ce40: 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20  i=nJRec-1; i>=0 
ce50: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
ce60: 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d  alOff < szJ; i--
ce70: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
ce80: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
ce90: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
cea0: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
ceb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
cec0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
ced0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
cee0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
cef0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
cf00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
cf10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cf20: 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
cf30: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
cf40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cf50: 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
cf60: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
cf70: 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
cf80: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
cf90: 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
cfa0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cfb0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
cfc0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
cfd0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
cfe0: 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
cff0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
d000: 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68  e3pager_set_cach
d010: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
d020: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
d030: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
d040: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
d050: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
d060: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d070: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
d080: 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
d090: 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
d0a0: 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
d0b0: 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
d0c0: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
d0d0: 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
d0e0: 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
d0f0: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
d100: 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
d110: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
d120: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
d130: 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
d140: 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
d150: 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
d160: 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
d170: 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
d180: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
d190: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
d1a0: 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
d1b0: 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
d1c0: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
d1d0: 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
d1e0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
d1f0: 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
d200: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
d210: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
d220: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
d230: 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
d240: 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
d250: 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
d260: 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
d270: 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
d280: 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
d290: 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
d2a0: 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
d2b0: 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
d2c0: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
d2d0: 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
d2e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d2f0: 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
d300: 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
d310: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
d320: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
d330: 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
d340: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
d350: 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
d360: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
d370: 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
d380: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
d390: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
d3a0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
d3b0: 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
d3c0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
d3d0: 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
d3e0: 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
d3f0: 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
d400: 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
d410: 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
d420: 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
d430: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
d440: 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
d450: 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
d460: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d470: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
d480: 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
d490: 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
d4a0: 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
d4b0: 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
d4c0: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
d4d0: 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
d4e0: 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
d4f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
d500: 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
d510: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
d520: 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
d530: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
d540: 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
d550: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
d560: 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
d570: 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
d580: 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
d590: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
d5a0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
d5b0: 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
d5c0: 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79  pager_set_safety
d5d0: 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  _level(Pager *pP
d5e0: 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ager, int level,
d5f0: 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29   int full_fsync)
d600: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
d610: 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
d620: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
d630: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
d640: 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  llSync = level==
d650: 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
d660: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
d670: 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66  ->full_fsync = f
d680: 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28  ull_fsync;.  if(
d690: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
d6a0: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
d6b0: 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
d6c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
d6d0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
d6e0: 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
d6f0: 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
d700: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
d710: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
d720: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
d730: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
d740: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
d750: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
d760: 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
d770: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
d780: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
d790: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
d7a0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
d7b0: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
d7c0: 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  ry file.  Write 
d7d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d7e0: 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65 0a  file into zFile.
d7f0: 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20 62  ** (zFile must b
d800: 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  e at least SQLIT
d810: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
d820: 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72  bytes long.)  Wr
d830: 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ite.** the file 
d840: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
d850: 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
d860: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
d870: 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
d880: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
d890: 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20   we fail..**.** 
d8a0: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
d8b0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
d8c0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
d8d0: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  ile when it is.*
d8e0: 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  * closed..*/.sta
d8f0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70  tic int sqlite3p
d900: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68  ager_opentemp(ch
d910: 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c  ar *zFile, OsFil
d920: 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  e **pFd){.  int 
d930: 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72  cnt = 8;.  int r
d940: 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
d950: 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
d960: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
d970: 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
d980: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
d990: 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
d9a0: 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74  if.  do{.    cnt
d9b0: 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  --;.    sqlite3O
d9c0: 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46  sTempFileName(zF
d9d0: 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ile);.    rc = s
d9e0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
d9f0: 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64  usive(zFile, pFd
da00: 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  , 1);.  }while( 
da10: 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c  cnt>0 && rc!=SQL
da20: 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
da30: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
da40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
da50: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
da60: 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
da70: 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
da80: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
da90: 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
daa0: 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
dab0: 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
dac0: 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
dad0: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
dae0: 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
daf0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
db00: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
db10: 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
db20: 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
db30: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
db40: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
db50: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
db60: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
db70: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
db80: 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
db90: 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
dba0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
dbb0: 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
dbc0: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
dbd0: 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
dbe0: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
dbf0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
dc00: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
dc10: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
dc20: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
dc30: 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
dc40: 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
dc50: 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
dc60: 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
dc70: 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
dc80: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
dc90: 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
dca0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
dcb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
dcc0: 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67  ager_open(.  Pag
dcd0: 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
dce0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
dcf0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
dd00: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
dd10: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
dd20: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
dd30: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
dd40: 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
dd50: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
dd60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
dd70: 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
dd80: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
dd90: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
dda0: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
ddb0: 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
ddc0: 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
ddd0: 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ile */.){.  Page
dde0: 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20  r *pPager = 0;. 
ddf0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
de00: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
de10: 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d  nameLen;  /* Com
de20: 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20  piler is wrong. 
de30: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 69  This is always i
de40: 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72  nitialized befor
de50: 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c  e use */.  OsFil
de60: 65 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63 20  e *fd;.  int rc 
de70: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
de80: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
de90: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
dea0: 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
deb0: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
dec0: 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
ded0: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
dee0: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
def0: 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
df00: 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
df10: 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
df20: 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65  )!=0;.  char zTe
df30: 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
df40: 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65 66  ME_SIZE];.#ifdef
df50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
df60: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
df70: 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
df80: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
df90: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
dfa0: 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
dfb0: 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
dfc0: 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
dfd0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
dfe0: 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
dff0: 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
e000: 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
e010: 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
e020: 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
e030: 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
e040: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
e050: 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
e060: 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
e070: 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20 49  oc can be set. I
e080: 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65 20  t would be nice 
e090: 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 74  to assert.  ** t
e0a0: 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
e0b0: 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Alloc is non-zer
e0c0: 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69 73  o, but alas this
e0d0: 20 62 72 65 61 6b 73 20 74 65 73 74 20 63 61 73   breaks test cas
e0e0: 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  es .  ** written
e0f0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 70   to invoke the p
e100: 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a 20  ager directly.. 
e110: 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
e120: 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
e130: 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
e140: 61 73 73 65 72 74 28 20 70 54 73 64 20 29 3b 0a  assert( pTsd );.
e150: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
e160: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 61 6c 72  malloc() has alr
e170: 65 61 64 79 20 66 61 69 6c 65 64 20 72 65 74 75  eady failed retu
e180: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
e190: 20 42 65 66 6f 72 65 20 65 76 65 6e 0a 20 20 2a   Before even.  *
e1a0: 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 68  * testing for th
e1b0: 69 73 2c 20 73 65 74 20 2a 70 70 50 61 67 65 72  is, set *ppPager
e1c0: 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 65 20   to NULL so the 
e1d0: 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 20 74 68 65  caller knows the
e1e0: 20 70 61 67 65 72 0a 20 20 2a 2a 20 73 74 72 75   pager.  ** stru
e1f0: 63 74 75 72 65 20 77 61 73 20 6e 65 76 65 72 20  cture was never 
e200: 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 20 20 2a 2f  allocated. .  */
e210: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
e220: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
e230: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
e240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e250: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
e260: 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69  emset(&fd, 0, si
e270: 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20 2f 2a  zeof(fd));..  /*
e280: 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
e290: 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46 75  file and set zFu
e2a0: 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f  llPathname to po
e2b0: 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65  int at malloc()e
e2c0: 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  d .  ** memory c
e2d0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
e2e0: 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65 20  mplete filename 
e2f0: 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20  (i.e. including 
e300: 74 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0a  the directory)..
e310: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
e320: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
e330: 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20  e[0] ){.#ifndef 
e340: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
e350: 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
e360: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
e370: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
e380: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
e390: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
e3a0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
e3b0: 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c  Dup("");.    }el
e3c0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
e3d0: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
e3e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
e3f0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
e400: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
e410: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
e420: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
e430: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
e440: 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68  dWrite(zFullPath
e450: 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64  name, &fd, &read
e460: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Only);.      }. 
e470: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
e480: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
e490: 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
e4a0: 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a 46  mp, &fd);.    zF
e4b0: 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b  ilename = zTemp;
e4c0: 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61  .    zFullPathna
e4d0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  me = sqlite3OsFu
e4e0: 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65  llPathname(zFile
e4f0: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
e500: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e510: 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d        tempFile =
e520: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
e530: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
e540: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
e550: 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65  . As part of the
e560: 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e   same allocation
e570: 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  , allocate.  ** 
e580: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 66 75  space for the fu
e590: 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65 20  ll paths of the 
e5a0: 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79 20  file, directory 
e5b0: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  and journal .  *
e5c0: 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  * (Pager.zFilena
e5d0: 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65 63  me, Pager.zDirec
e5e0: 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e 7a  tory and Pager.z
e5f0: 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20  Journal)..  */. 
e600: 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61   if( zFullPathna
e610: 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65  me ){.    nameLe
e620: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c  n = strlen(zFull
e630: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70  Pathname);.    p
e640: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61  Pager = sqliteMa
e650: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50  lloc( sizeof(*pP
e660: 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a  ager) + nameLen*
e670: 33 20 2b 20 33 30 20 29 3b 0a 20 20 7d 0a 0a 20  3 + 30 );.  }.. 
e680: 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
e690: 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65  occured in eithe
e6a0: 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
e6b0: 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
e6c0: 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69  memory .  ** poi
e6d0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c  nted to by zFull
e6e0: 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74  Pathname, free t
e6f0: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
e700: 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
e710: 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e   .  ** file. Sin
e720: 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
e730: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68  not allocated th
e740: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
e750: 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20  o set .  ** any 
e760: 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61  Pager.errMask va
e770: 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  riables..  */.  
e780: 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21  if( !pPager || !
e790: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c  zFullPathname ||
e7a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e7b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
e7c0: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73  lose(&fd);.    s
e7d0: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
e7e0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71  athname);.    sq
e7f0: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
e800: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72  ;.    return ((r
e810: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51  c==SQLITE_OK)?SQ
e820: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a  LITE_NOMEM:rc);.
e830: 20 20 7d 0a 0a 20 20 54 52 41 43 45 33 28 22 4f    }..  TRACE3("O
e840: 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
e850: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c 20  LEHANDLEID(fd), 
e860: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e870: 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
e880: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
e890: 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
e8a0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20  r->zDirectory = 
e8b0: 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  &pPager->zFilena
e8c0: 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  me[nameLen+1];. 
e8d0: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
e8e0: 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69  l = &pPager->zDi
e8f0: 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b  rectory[nameLen+
e900: 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  1];.  strcpy(pPa
e910: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
e920: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e930: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
e940: 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75  >zDirectory, zFu
e950: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20  llPathname);..  
e960: 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69  for(i=nameLen; i
e970: 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
e980: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
e990: 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
e9a0: 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
e9b0: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
e9c0: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61   0;.  strcpy(pPa
e9d0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
e9e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e9f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
ea00: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74  lPathname);.  st
ea10: 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  rcpy(&pPager->zJ
ea20: 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c  ournal[nameLen],
ea30: 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20   "-journal");.  
ea40: 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b  pPager->fd = fd;
ea50: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  .  /* pPager->jo
ea60: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a  urnalOpen = 0; *
ea70: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  /.  pPager->useJ
ea80: 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
ea90: 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
eaa0: 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
eab0: 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
eac0: 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
ead0: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
eae0: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
eaf0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
eb00: 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
eb10: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
eb20: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
eb30: 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
eb40: 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
eb50: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
eb60: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
eb70: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
eb80: 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
eb90: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
eba0: 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
ebb0: 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
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 4d 61 78 50 61 67 65 20 3d 20  ger->nMaxPage = 
ebe0: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
ebf0: 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
ec00: 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 55 4e  assert( PAGER_UN
ec10: 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20  LOCK==0 );.  /* 
ec20: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
ec30: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
ec40: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
ec50: 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
ec60: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
ec70: 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70   = tempFile;.  p
ec80: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
ec90: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
eca0: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
ecb0: 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
ecc0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
ecd0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
ece0: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
ecf0: 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
ed00: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
ed10: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
ed20: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
ed30: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
ed40: 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
ed50: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
ed60: 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
ed70: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
ed80: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
ed90: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f  ger->nExtra = FO
eda0: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
edb0: 78 74 72 61 29 3b 0a 20 20 70 50 61 67 65 72 2d  xtra);.  pPager-
edc0: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41  >sectorSize = PA
edd0: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  GER_SECTOR_SIZE;
ede0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
edf0: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
ee00: 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  */.  /* memset(p
ee10: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
ee20: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
ee30: 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70  aHash)); */.  *p
ee40: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
ee50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ee60: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
ee70: 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72  AGEMENT.  pPager
ee80: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e  ->pNext = pTsd->
ee90: 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e  pPager;.  pTsd->
eea0: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
eeb0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
eec0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
eed0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
eee0: 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
eef0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
ef00: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73  te3pager_set_bus
ef10: 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
ef20: 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
ef30: 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
ef40: 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
ef50: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
ef60: 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
ef70: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
ef80: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
ef90: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
efa0: 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
efb0: 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
efc0: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
efd0: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
efe0: 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
eff0: 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
f000: 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
f010: 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
f020: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
f030: 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
f040: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
f050: 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
f060: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
f070: 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
f080: 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70 61  result sqlite3pa
f090: 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a  ger_close().  .*
f0a0: 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
f0b0: 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
f0c0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
f0d0: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
f0e0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
f0f0: 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  destructor(Pager
f100: 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
f110: 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e  *xDesc)(void*,in
f120: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
f130: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
f140: 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
f150: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
f160: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
f170: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
f180: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
f190: 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
f1a0: 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
f1b0: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
f1c0: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
f1d0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
f1e0: 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
f1f0: 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
f200: 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
f210: 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
f220: 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
f230: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
f240: 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
f250: 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
f260: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
f270: 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
f280: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f290: 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69  3pager_set_reini
f2a0: 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
f2b0: 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
f2c0: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  t)(void*,int)){.
f2d0: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
f2e0: 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
f2f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f300: 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75  page size.  Retu
f310: 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e  rn the new size.
f320: 20 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74    If the suggest
f330: 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a   new page.** siz
f340: 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61  e is inappropria
f350: 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65  te, then an alte
f360: 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a  rnative page siz
f370: 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a  e is selected.**
f380: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a   and returned..*
f390: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
f3a0: 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28  er_set_pagesize(
f3b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
f3c0: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
f3d0: 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
f3e0: 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
f3f0: 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
f400: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28  GE_SIZE );.  if(
f410: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
f420: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
f430: 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
f440: 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ze;.  }.  return
f450: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f460: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  e;.}../*.** The 
f470: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
f480: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
f490: 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
f4a0: 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
f4b0: 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
f4c0: 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
f4d0: 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
f4e0: 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
f4f0: 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
f500: 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
f510: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
f520: 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
f530: 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
f540: 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
f550: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
f560: 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
f570: 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
f580: 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
f590: 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
f5a0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
f5b0: 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
f5c0: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
f5d0: 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
f5e0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
f5f0: 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61 72  _cnt;.void clear
f600: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
f610: 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74 65 33  ror(){.  sqlite3
f620: 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20  _io_error_hit = 
f630: 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62 6c  0;.}.void disabl
f640: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
f650: 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
f660: 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
f670: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
f680: 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
f690: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
f6a0: 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
f6b0: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
f6c0: 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
f6d0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
f6e0: 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
f6f0: 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
f700: 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f 73 69   define clear_si
f710: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f720: 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  ().# define disa
f730: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
f740: 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
f750: 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
f760: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
f770: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
f780: 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
f790: 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
f7a0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
f7b0: 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
f7c0: 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
f7d0: 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
f7e0: 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  No error checkin
f7f0: 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72  g is done. The r
f800: 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73  ational for this
f810: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
f820: 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62  nction .** may b
f830: 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66  e called even if
f840: 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
f850: 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74  ot exist or cont
f860: 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e  ain a header. In
f870: 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73   .** these cases
f880: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29   sqlite3OsRead()
f890: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20   will return an 
f8a0: 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20  error, to which 
f8b0: 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20  the correct .** 
f8c0: 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a  response is to z
f8d0: 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ero the memory a
f8e0: 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74  t pDest and cont
f8f0: 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f  inue.  A real IO
f900: 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20   error .** will 
f910: 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72  presumably recur
f920: 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75   and be picked u
f930: 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54  p later (Todo: T
f940: 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29  hink about this)
f950: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
f960: 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c 65  3pager_read_file
f970: 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
f980: 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
f990: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
f9a0: 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  t){.  memset(pDe
f9b0: 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28  st, 0, N);.  if(
f9c0: 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20 20   MEMDB==0 ){.   
f9d0: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
f9e0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
f9f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
fa00: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29  k(pPager->fd, 0)
fa10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52  ;.    sqlite3OsR
fa20: 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
fa30: 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20 65  pDest, N);.    e
fa40: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
fa50: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 7d  io_errors();.  }
fa60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
fa70: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
fa80: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
fa90: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
faa0: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
fab0: 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Pager. .**.** If
fac0: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54   the PENDING_BYT
fad0: 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  E lies on the pa
fae0: 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65  ge directly afte
faf0: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
fb00: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63  .** file, then c
fb10: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67  onsider this pag
fb20: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  e part of the fi
fb30: 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d  le too. For exam
fb40: 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49  ple, if.** PENDI
fb50: 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20  NG_BYTE is byte 
fb60: 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20  4096 (the first 
fb70: 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20  byte of page 5) 
fb80: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
fb90: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34  the.** file is 4
fba0: 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20  096 bytes, 5 is 
fbb0: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
fbc0: 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71   of 4..*/.int sq
fbd0: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
fbe0: 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
fbf0: 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  er){.  i64 n;.  
fc00: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
fc10: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
fc20: 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
fc30: 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
fc40: 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
fc50: 20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   {.    if( sqlit
fc60: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
fc70: 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51  ger->fd, &n)!=SQ
fc80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
fc90: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
fca0: 67 65 72 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ger, SQLITE_IOER
fcb0: 52 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  R);.      return
fcc0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
fcd0: 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
fce0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
fcf0: 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
fd00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f  }else{.      n /
fd10: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
fd20: 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ze;.    }.    if
fd30: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
fd40: 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
fd50: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
fd60: 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d  bSize = n;.    }
fd70: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50  .  }.  if( n==(P
fd80: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
fd90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
fda0: 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
fdb0: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69  return n;.}...#i
fdc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fdd0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
fde0: 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f   Clear a PgHisto
fdf0: 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  ry block.*/.stat
fe00: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73  ic void clearHis
fe10: 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a  tory(PgHistory *
fe20: 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pHist){.  sqlite
fe30: 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69  Free(pHist->pOri
fe40: 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  g);.  sqliteFree
fe50: 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
fe60: 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
fe70: 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74   0;.  pHist->pSt
fe80: 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a  mt = 0;.}.#else.
fe90: 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73  #define clearHis
fea0: 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a  tory(x).#endif..
feb0: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
fec0: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
fed0: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
fee0: 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a  nal(Pager*);../*
fef0: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66  .** Unlink pPg f
ff00: 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
ff10: 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
ff20: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
ff30: 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
ff40: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
ff50: 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
ff60: 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
ff70: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
ff80: 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
ff90: 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
ffa0: 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63  page() routine c
ffb0: 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20  an leave a page 
ffc0: 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74  in the .** pNext
ffd0: 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c  Free/pPrevFree l
ffe0: 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ist that is not 
fff0: 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  a part of any ha
10000 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  sh-chain..*/.sta
10010 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48  tic void unlinkH
10020 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a  ashChain(Pager *
10030 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
10040 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
10050 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pgno==0 ){.    a
10060 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
10070 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d  tHash==0 && pPg-
10080 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
10090 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
100a0 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
100b0 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  tHash ){.    pPg
100c0 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
100d0 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
100e0 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  revHash;.  }.  i
100f0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
10100 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
10110 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
10120 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
10130 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70  er->nHash-1)]!=p
10140 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
10150 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
10160 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
10170 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
10180 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e     int h = pPg->
10190 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
101a0 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50  nHash-1);.    pP
101b0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
101c0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
101d0 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
101e0 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73   ){.    clearHis
101f0 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49  tory(PGHDR_TO_HI
10200 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29  ST(pPg, pPager))
10210 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e  ;.  }.  pPg->pgn
10220 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e  o = 0;.  pPg->pN
10230 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
10240 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a  PrevHash = 0;.}.
10250 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
10260 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
10270 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
10280 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
10290 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
102a0 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
102b0 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
102c0 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
102d0 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
102e0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
102f0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
10300 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
10310 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
10320 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
10330 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
10340 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
10350 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
10360 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
10370 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
10380 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
10390 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
103a0 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
103b0 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
103c0 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
103d0 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
103e0 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
103f0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
10400 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
10410 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
10420 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
10430 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
10440 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
10450 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
10460 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
10470 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
10480 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
10490 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
104a0 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
104b0 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
104c0 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
104d0 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
104e0 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
104f0 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
10500 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10510 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
10520 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
10530 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
10540 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
10550 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
10560 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
10570 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
10580 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
10590 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69   table */.  unli
105a0 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
105b0 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66  er, pPg);.}..#if
105c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
105d0 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
105e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
105f0 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65  used to truncate
10600 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
10610 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a  tabase.  Delete.
10620 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f  ** all pages who
10630 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65  se pgno is large
10640 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
10650 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72  bSize and is unr
10660 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65  eferenced..** Re
10670 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c  ferenced pages l
10680 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
10690 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65  r->dbSize are ze
106a0 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  roed..*/.static 
106b0 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63  void memoryTrunc
106c0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
106d0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
106e0 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67  ;.  PgHdr **ppPg
106f0 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d  ;.  int dbSize =
10700 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
10710 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67  ..  ppPg = &pPag
10720 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c  er->pAll;.  whil
10730 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29  e( (pPg = *ppPg)
10740 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
10750 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65  Pg->pgno<=dbSize
10760 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d   ){.      ppPg =
10770 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
10780 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
10790 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20  Pg->nRef>0 ){.  
107a0 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
107b0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
107c0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
107d0 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20  ze);.      ppPg 
107e0 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
107f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10800 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e     *ppPg = pPg->
10810 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
10820 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
10830 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
10840 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pPg);.      sql
10850 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
10860 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
10870 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  e--;.    }.  }.}
10880 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 6d  .#else.#define m
10890 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 29  emoryTruncate(p)
108a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
108b0 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
108c0 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20  ock on a file.  
108d0 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
108e0 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
108f0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65  lock.** is curre
10900 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
10910 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69  le.  Repeat unti
10920 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
10930 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66  ack returns.** f
10940 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
10950 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
10960 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
10970 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
10980 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
10990 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
109a0 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
109b0 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
109c0 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
109d0 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
109e0 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
109f0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pe){.  int rc;. 
10a00 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
10a10 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
10a20 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
10a30 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
10a40 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
10a50 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
10a60 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
10a70 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
10a80 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
10a90 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
10aa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
10ab0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
10ac0 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
10ad0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
10ae0 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
10af0 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
10b00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
10b10 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b   && sqlite3Invok
10b20 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  eBusyHandler(pPa
10b30 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
10b40 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  r) );.    if( rc
10b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10b60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
10b70 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  te = locktype;. 
10b80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10b90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
10ba0 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
10bb0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
10bc0 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65  f pages specifie
10bd0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
10be0 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
10bf0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
10c00 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
10c10 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 70  t rc;.  sqlite3p
10c20 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
10c30 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
10c40 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
10c50 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
10c60 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72  ->errCode;.    r
10c70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10c80 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69  if( nPage>=(unsi
10c90 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
10ca0 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
10cb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10cc0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
10cd0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10ce0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
10cf0 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
10d00 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
10d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10d20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  }.  rc = syncJou
10d30 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
10d40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10d50 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
10d60 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  rc;.  }..  /* Ge
10d70 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
10d80 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
10d90 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63  ase before trunc
10da0 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d  ating. */.  rc =
10db0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
10dc0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
10dd0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69  USIVE_LOCK);.  i
10de0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10df0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10e00 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70  c;.  }..  rc = p
10e10 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
10e20 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
10e30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10e40 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
10e50 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
10e60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
10e80 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
10e90 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
10ea0 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
10eb0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
10ec0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
10ed0 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
10ee0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
10ef0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
10f00 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
10f10 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
10f20 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
10f30 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
10f40 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
10f50 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
10f60 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
10f70 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
10f80 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
10f90 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
10fa0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
10fb0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
10fc0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
10fd0 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
10fe0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
10ff0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
11000 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
11010 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
11020 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
11030 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
11040 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
11050 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
11060 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
11070 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
11080 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
11090 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
110a0 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
110b0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
110c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
110d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
110e0 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a  er_close(Pager *
110f0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
11100 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 23   *pPg, *pNext;.#
11110 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11120 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
11130 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c  EMENT.  /* A mal
11140 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  loc() cannot fai
11150 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65  l in sqlite3Thre
11160 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20  adData() as one 
11170 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f  or more calls to
11180 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20   .  ** malloc() 
11190 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
111a0 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74  y been made by t
111b0 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72  his thread befor
111c0 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74  e it gets.  ** t
111d0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68  o this point. Th
111e0 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72  is means the Thr
111f0 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76  eadData must hav
11200 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  e been allocated
11210 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f   already.  ** so
11220 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61   that ThreadData
11230 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73  .nAlloc can be s
11240 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61  et..  */.  Threa
11250 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
11260 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
11270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11280 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
11290 20 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e   pTsd && pTsd->n
112a0 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a  Alloc );.#endif.
112b0 0a 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65  .  switch( pPage
112c0 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20  r->state ){.    
112d0 63 61 73 65 20 50 41 47 45 52 5f 52 45 53 45 52  case PAGER_RESER
112e0 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41  VED:.    case PA
112f0 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20  GER_SYNCED: .   
11300 20 63 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c   case PAGER_EXCL
11310 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 2f  USIVE: {.      /
11320 2a 20 57 65 20 69 67 6e 6f 72 65 20 61 6e 79 20  * We ignore any 
11330 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f  IO errors that o
11340 63 63 75 72 20 64 75 72 69 6e 67 20 74 68 65 20  ccur during the 
11350 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a  rollback.      *
11360 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 6f 20  * operation. So 
11370 64 69 73 61 62 6c 65 20 49 4f 20 65 72 72 6f 72  disable IO error
11380 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f 20 74   simulation so t
11390 68 61 74 20 74 65 73 74 69 6e 67 0a 20 20 20 20  hat testing.    
113a0 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72 65 20    ** works more 
113b0 65 61 73 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  easily..      */
113c0 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f 73  .      disable_s
113d0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
113e0 72 73 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rs();.      sqli
113f0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
11400 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
11410 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
11420 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
11430 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20       if( !MEMDB 
11440 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11450 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
11460 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
11470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
11480 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
11490 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  rrCode || pPager
114a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
114b0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
114c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
114d0 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a  PAGER_SHARED: {.
114e0 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42        if( !MEMDB
114f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11500 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
11510 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
11520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11530 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
11540 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
11550 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
11560 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
11570 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
11580 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
11590 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
115a0 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ){.#ifndef NDEBU
115b0 47 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  G.    if( MEMDB 
115c0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
115d0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
115e0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
115f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
11600 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
11610 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
11620 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
11630 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
11640 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
11650 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
11660 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65  }.#endif.    pNe
11670 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
11680 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
11690 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54  ee(pPg);.  }.  T
116a0 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
116b0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
116c0 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
116d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
116e0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
116f0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50  nalOpen==0 && pP
11700 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d  ager->stmtOpen==
11710 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
11720 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
11730 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
11740 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
11750 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
11760 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
11770 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  nJournal);.  if(
11780 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
11790 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
117a0 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
117b0 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >stfd);.  }.  sq
117c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
117d0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20  ager->fd);.  /* 
117e0 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61  Temp files are a
117f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
11800 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20  eted by the OS. 
11810 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   ** if( pPager->
11820 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a  tempFile ){.  **
11830 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
11840 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
11850 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20  name);.  ** }.  
11860 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
11870 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
11880 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20  MANAGEMENT.  /* 
11890 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  Remove the pager
118a0 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64   from the linked
118b0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20   list of pagers 
118c0 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20 2a  starting at .  *
118d0 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70 50 61  * ThreadData.pPa
118e0 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61  ger if memory-ma
118f0 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62  nagement is enab
11900 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
11910 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50  pPager==pTsd->pP
11920 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73 64  ager ){.    pTsd
11930 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
11940 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  r->pNext;.  }els
11950 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 54  e{.    Pager *pT
11960 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d 70  mp;.    for(pTmp
11970 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b   = pTsd->pPager;
11980 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50   pTmp->pNext!=pP
11990 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d  ager; pTmp=pTmp-
119a0 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70 54  >pNext){}.    pT
119b0 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67  mp->pNext = pPag
119c0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23  er->pNext;.  }.#
119d0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72  endif.  sqliteFr
119e0 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
119f0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
11a00 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
11a10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11a20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11a30 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
11a40 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
11a50 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
11a60 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e  lite3pager_pagen
11a70 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74  umber(void *pDat
11a80 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  a){.  PgHdr *p =
11a90 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
11aa0 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
11ab0 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pgno;.}../*.*
11ac0 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
11ad0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
11ae0 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
11af0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
11b00 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
11b10 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
11b20 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
11b30 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
11b40 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
11b50 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
11b60 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
11b70 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
11b80 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
11b90 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
11ba0 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
11bb0 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
11bc0 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
11bd0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
11be0 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
11bf0 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
11c00 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
11c10 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
11c20 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
11c30 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
11c40 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
11c50 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
11c60 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
11c70 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
11c80 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
11c90 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
11ca0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
11cb0 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
11cc0 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50  .    if( pPg==pP
11cd0 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
11ce0 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20  tSynced ){.     
11cf0 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
11d00 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
11d10 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
11d20 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
11d30 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
11d40 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
11d50 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
11d60 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
11d70 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
11d80 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
11d90 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
11da0 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
11db0 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  xtFree;.    }els
11dc0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
11dd0 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
11de0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
11df0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
11e00 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
11e10 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
11e20 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
11e30 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
11e40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11e50 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
11e60 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
11e70 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  vFree;.    }.   
11e80 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
11e90 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
11ea0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
11eb0 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65  FO(pPg);.}.#ifde
11ec0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
11ed0 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
11ee0 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
11ef0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
11f00 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
11f10 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b   _page_ref(pPg);
11f20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11f30 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
11f40 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67       REFINFO(pPg
11f50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
11f60 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
11f70 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
11f80 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
11f90 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
11fa0 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
11fb0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
11fc0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
11fd0 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
11fe0 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
11ff0 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
12000 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
12010 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
12020 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76  lite3pager_ref(v
12030 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
12040 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
12050 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
12060 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
12070 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12080 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12090 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
120a0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
120b0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
120c0 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
120d0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
120e0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
120f0 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
12100 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
12110 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
12120 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
12130 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
12140 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
12150 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
12160 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
12170 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
12180 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
12190 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
121a0 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
121b0 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
121c0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
121d0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
121e0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
121f0 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
12200 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
12210 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
12220 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
12230 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
12240 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
12250 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
12260 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
12270 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
12280 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12290 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
122a0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
122b0 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
122c0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
122d0 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
122e0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
122f0 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
12300 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
12310 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
12320 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
12330 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
12340 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
12350 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
12360 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
12370 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
12380 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
12390 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
123a0 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
123b0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
123c0 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
123d0 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
123e0 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
123f0 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
12400 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
12410 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   so sync occurs.
12420 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12430 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
12440 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
12450 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
12460 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
12470 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
12480 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
12490 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
124a0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
124b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
124c0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  _OK;..  /* Sync 
124d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
124e0 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
124f0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20   main database. 
12500 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68   ** (assuming th
12510 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c  ere is a journal
12520 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f   and it needs to
12530 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a   be synced.).  *
12540 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12550 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
12560 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
12570 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61  pFile ){.      a
12580 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
12590 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
125a0 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
125b0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
125c0 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68  ; // noSync migh
125d0 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63  t be set if sync
125e0 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a  hronous.      **
125f0 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20   was turned off 
12600 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
12610 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
12620 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20  d.  Ticket #615 
12630 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
12640 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  G.      {.      
12650 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
12660 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  he pPager->nRec 
12670 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b  counter we are k
12680 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20  eeping agrees.  
12690 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
126a0 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  e nRec computed 
126b0 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
126c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
126d0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
126e0 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20        i64 jSz;. 
126f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12700 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
12710 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29  ager->jfd, &jSz)
12720 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12730 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
12740 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12750 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12760 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20  Off==jSz );.    
12770 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
12780 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72   {.        /* Wr
12790 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
127a0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
127b0 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
127c0 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
127d0 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
127e0 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
127f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
12800 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
12810 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
12820 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
12830 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
12840 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
12850 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
12860 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
12870 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
12880 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20  ollback. .      
12890 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
128a0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
128b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54  c ){.          T
128c0 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
128d0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
128e0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
128f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
12900 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
12910 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
12920 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
12930 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
12940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12950 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
12960 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
12970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12980 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
12990 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
129a0 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
129b0 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
129c0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
129d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20   rc;.        rc 
129e0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
129f0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
12a00 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
12a10 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12a20 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72  n rc;..        r
12a30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
12a40 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
12a50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12a60 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
12a70 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
12a90 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
12aa0 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
12ab0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
12ac0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12ad0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
12ae0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  jfd, pPager->ful
12af0 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20  l_fsync);.      
12b00 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
12b10 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61  rn rc;.      pPa
12b20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
12b30 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
12b40 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
12b50 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
12b60 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
12b70 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
12b80 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
12b90 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
12ba0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
12bb0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
12bc0 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
12bd0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
12be0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
12bf0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
12c00 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
12c10 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
12c20 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61  G.  /* If the Pa
12c30 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
12c40 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
12c50 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
12c60 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73  nc.  ** flag mus
12c70 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20  t also be clear 
12c80 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20  for all pages.  
12c90 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
12ca0 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20  .  ** invariant 
12cb0 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  is true..  */.  
12cc0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50  else{.    for(pP
12cd0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
12ce0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
12cf0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61  extAll){.      a
12d00 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
12d10 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Sync==0 );.    }
12d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
12d30 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
12d40 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  d==pPager->pFirs
12d50 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
12d60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12d70 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f  ./*.** Merge two
12d80 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65 73 20   lists of pages 
12d90 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
12da0 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20  rty and in pgno 
12db0 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  order..** Do not
12dc0 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65   both fixing the
12dd0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
12de0 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
12df0 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67  PgHdr *merge_pag
12e00 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c  elist(PgHdr *pA,
12e10 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50   PgHdr *pB){.  P
12e20 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54  gHdr result, *pT
12e30 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26  ail;.  pTail = &
12e40 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28  result;.  while(
12e50 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20   pA && pB ){.   
12e60 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42   if( pA->pgno<pB
12e70 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
12e80 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
12e90 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pA;.      pTail 
12ea0 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d  = pA;.      pA =
12eb0 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pA->pDirty;.   
12ec0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
12ed0 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42  ail->pDirty = pB
12ee0 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
12ef0 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  pB;.      pB = p
12f00 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  B->pDirty;.    }
12f10 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b  .  }.  if( pA ){
12f20 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
12f30 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65  ty = pA;.  }else
12f40 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70   if( pB ){.    p
12f50 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
12f60 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  B;.  }else{.    
12f70 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
12f80 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
12f90 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d  result.pDirty;.}
12fa0 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65  ../*.** Sort the
12fb0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69   list of pages i
12fc0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
12fd0 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65  r by pgno.  Page
12fe0 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  s are.** connect
12ff0 65 64 20 62 79 20 70 44 69 72 74 79 20 70 6f 69  ed by pDirty poi
13000 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50 72 65  nters.  The pPre
13010 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20  vDirty pointers 
13020 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64  are.** corrupted
13030 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a   by this sort..*
13040 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54  /.#define N_SORT
13050 5f 42 55 43 4b 45 54 20 32 35 0a 73 74 61 74 69  _BUCKET 25.stati
13060 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61  c PgHdr *sort_pa
13070 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49  gelist(PgHdr *pI
13080 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e  n){.  PgHdr *a[N
13090 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5d 2c 20 2a  _SORT_BUCKET], *
130a0 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65  p;.  int i;.  me
130b0 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f  mset(a, 0, sizeo
130c0 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  f(a));.  while( 
130d0 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  pIn ){.    p = p
130e0 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d  In;.    pIn = p-
130f0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e  >pDirty;.    p->
13100 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
13110 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52  for(i=0; i<N_SOR
13120 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29  T_BUCKET-1; i++)
13130 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d  {.      if( a[i]
13140 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
13150 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  [i] = p;.       
13160 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
13170 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  lse{.        p =
13180 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
13190 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20  a[i], p);.      
131a0 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20    a[i] = 0;.    
131b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
131c0 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b  ( i==N_SORT_BUCK
131d0 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 61 5b  ET-1 ){.      a[
131e0 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c  i] = merge_pagel
131f0 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
13200 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b    }.  }.  p = a[
13210 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  0];.  for(i=1; i
13220 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20  <N_SORT_BUCKET; 
13230 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65  i++){.    p = me
13240 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20  rge_pagelist(p, 
13250 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  a[i]);.  }.  ret
13260 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
13270 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
13280 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
13290 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
132a0 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
132b0 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
132c0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
132d0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
132e0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
132f0 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
13300 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
13310 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
13320 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
13330 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
13340 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
13350 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
13360 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
13370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
13380 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
13390 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
133a0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
133b0 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
133c0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
133d0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
133e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
133f0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
13400 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
13410 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
13420 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
13430 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
13440 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
13450 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
13460 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
13470 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
13480 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
13490 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
134a0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
134b0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
134c0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
134d0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
134e0 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
134f0 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
13500 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
13510 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
13520 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
13530 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
13540 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
13550 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
13560 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
13570 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
13580 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
13590 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
135a0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
135b0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
135c0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
135d0 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
135e0 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
135f0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
13600 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
13610 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
13620 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
13630 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
13640 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
13650 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
13660 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
13670 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
13680 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
13690 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
136a0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
136b0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
136c0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
136d0 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
136e0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
136f0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
13700 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
13710 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
13720 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
13730 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
13740 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13750 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
13760 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73    }..  pList = s
13770 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69  ort_pagelist(pLi
13780 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  st);.  while( pL
13790 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
137a0 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
137b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
137c0 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
137d0 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67  ->fd, (pList->pg
137e0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
137f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
13800 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13810 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20  n rc;.    /* If 
13820 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
13830 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
13840 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
13850 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
13860 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
13870 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
13880 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61   means sqlite3pa
13890 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77  ger_truncate() w
138a0 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
138b0 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
138c0 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
138d0 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
138e0 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
138f0 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
13900 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
13910 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
13920 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
13930 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
13940 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
13950 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
13960 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48  DEC2(pPager, PGH
13970 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
13980 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
13990 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  6);.      TRACE3
139a0 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
139b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
139c0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
139d0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  gno);.      rc =
139e0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
139f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
13a00 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
13a10 69 7a 65 29 3b 0a 20 20 20 20 20 20 54 45 53 54  ize);.      TEST
13a20 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
13a30 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  rite);.    }.#if
13a40 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
13a50 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43  else{.      TRAC
13a60 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E3("NOSTORE %d p
13a70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
13a80 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73  ID(pPager), pLis
13a90 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  t->pgno);.    }.
13aa0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72  #endif.    if( r
13ab0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
13ac0 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20     pList->dirty 
13ad0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
13ae0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
13af0 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61     pList->pageHa
13b00 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
13b10 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64  ash(pList);.#end
13b20 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  if.    pList = p
13b30 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
13b40 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
13b50 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
13b60 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72  ollect every dir
13b70 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64  ty page into a d
13b80 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  irty list and.**
13b90 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
13ba0 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
13bb0 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c   that list.  All
13bc0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   pages are.** co
13bd0 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  llected even if 
13be0 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69  they are still i
13bf0 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
13c00 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65   PgHdr *pager_ge
13c10 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
13c20 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
13c30 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
13c40 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  r->pDirty;.}../*
13c50 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
13c60 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
13c70 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
13c80 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
13c90 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
13ca0 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
13cb0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
13cc0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
13cd0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
13ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13cf0 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
13d00 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
13d10 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
13d20 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
13d30 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
13d40 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
13d50 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
13d60 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
13d70 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
13d80 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
13d90 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
13da0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
13db0 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
13dc0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
13dd0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
13de0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
13df0 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
13e00 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30  rnal) ) return 0
13e10 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  ;.  if( sqlite3O
13e20 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
13e30 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  ck(pPager->fd) )
13e40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
13e50 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
13e60 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
13e70 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13e80 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13e90 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
13ea0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
13eb0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
13ec0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
13ed0 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
13ee0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
13ef0 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
13f00 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
13f10 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
13f20 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13f30 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
13f40 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
13f50 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
13f60 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
13f70 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
13f80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13f90 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
13fa0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
13fb0 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
13fc0 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
13fd0 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
13fe0 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
13ff0 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
14000 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
14010 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
14020 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73  .  ** require us
14030 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
14040 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
14050 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
14060 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
14070 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  ced;..  /* If we
14080 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
14090 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
140a0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
140b0 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20  fsync().  ** on 
140c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
140d0 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
140e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
140f0 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65  his is a.  ** ve
14100 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f  ry slow operatio
14110 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61  n, so we work ha
14120 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20  rd to avoid it. 
14130 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20   But sometimes. 
14140 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
14150 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  helped..  */.  i
14160 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61  f( pPg==0 && pPa
14170 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20 73  ger->pFirst && s
14180 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29  yncOk && !MEMDB)
14190 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
141a0 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
141b0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
141c0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
141d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
141e0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
141f0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sync ){.      /*
14200 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
14210 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
14220 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
14230 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
14240 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
14250 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
14260 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
14270 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
14280 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72  .      ** header
14290 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
142a0 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
142b0 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
142c0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  have.      ** al
142d0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
142e0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
142f0 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
14300 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20  header is.      
14310 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
14320 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
14330 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
14340 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
14350 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
14360 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14370 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
14380 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
14390 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
143a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
143b0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
143c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
143d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
143e0 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
143f0 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  First;.  }.  if(
14400 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pPg==0 ){.    r
14410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14420 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
14430 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
14440 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
14450 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
14460 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
14470 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
14480 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
14490 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
144a0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
144b0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
144c0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
144d0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  );.    pPg->dirt
144e0 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
144f0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
14500 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
14510 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29  _pagelist( pPg )
14520 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14540 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14550 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
14560 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
14570 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
14580 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
14590 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
145a0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
145b0 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74   then.  ** set t
145c0 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
145d0 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
145e0 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
145f0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f  e.  ** sqlite_do
14600 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  nt_rollback() op
14610 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
14620 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
14630 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
14640 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
14650 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
14660 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
14670 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
14680 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ack.  ** might b
14690 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
146a0 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
146b0 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
146c0 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
146d0 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
146e0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
146f0 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
14700 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
14710 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d  s must.  ** be m
14720 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
14730 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
14740 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20  e on out..  */. 
14750 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
14760 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
14770 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
14780 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  llback = 1;.  }.
14790 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
147a0 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
147b0 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
147c0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
147d0 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67    */.  unlinkPag
147e0 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54 5f 49  e(pPg);.  TEST_I
147f0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66  NCR(pPager->nOvf
14800 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70  l);..  *ppPg = p
14810 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
14820 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14830 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14840 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65  s called to free
14850 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e   superfluous dyn
14860 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
14870 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c  ed memory.** hel
14880 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73  d by the pager s
14890 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e  ystem. Memory in
148a0 20 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69   use by any SQLi
148b0 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74  te pager allocat
148c0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72  ed.** by the cur
148d0 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20  rent thread may 
148e0 62 65 20 73 71 6c 69 74 65 46 72 65 65 28 29 65  be sqliteFree()e
148f0 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73  d..**.** nReq is
14900 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
14910 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
14920 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68  equired. Once th
14930 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62  is much has.** b
14940 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68  een released, th
14950 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
14960 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76  ns. A negative v
14970 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65  alue for nReq me
14980 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d  ans.** free as m
14990 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
149a0 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75  ssible. The retu
149b0 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
149c0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a  total number .**
149d0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
149e0 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  ory released..*/
149f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14a00 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
14a10 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69  AGEMENT.int sqli
14a20 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61 73 65  te3pager_release
14a30 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  _memory(int nReq
14a40 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  ){.  const Threa
14a50 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20  dData *pTsdro = 
14a60 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
14a70 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 50  aReadOnly();.  P
14a80 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  ager *p;.  int n
14a90 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20  Released = 0;.  
14aa0 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20  int i;..  /* If 
14ab0 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  the the global m
14ac0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68  utex is held, th
14ad0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65  is subroutine be
14ae0 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f  comes a.  ** o-o
14af0 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66  p; zero bytes of
14b00 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65   memory are free
14b10 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  d.  This is beca
14b20 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66  use.  ** some of
14b30 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65   the code invoke
14b40 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
14b50 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a  on may also.  **
14b60 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74   try to obtain t
14b70 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74  he mutex, result
14b80 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63  ing in a deadloc
14b90 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  k..  */.  if( sq
14ba0 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30  lite3OsInMutex(0
14bb0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
14bc0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74  0;.  }..  /* Out
14bd0 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73  ermost loop runs
14be0 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f   for at most two
14bf0 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72   iterations. Fir
14c00 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a  st iteration we.
14c10 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64    ** try to find
14c20 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e   memory that can
14c30 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74   be released wit
14c40 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79  hout calling fsy
14c50 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a  nc(). Second.  *
14c60 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69  * iteration (whi
14c70 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20  ch only runs if 
14c80 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64  the first failed
14c90 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79   to free nReq by
14ca0 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f  tes of.  ** memo
14cb0 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  ry) is permitted
14cc0 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29   to call fsync()
14cd0 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75  . This is of cou
14ce0 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20  rse much more . 
14cf0 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20   ** expensive.. 
14d00 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
14d10 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20  <=1; i++){..    
14d20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
14d30 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70  all the SQLite p
14d40 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20  agers opened by 
14d50 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
14d60 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ad. */.    for(p
14d70 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b  =pTsdro->pPager;
14d80 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c   p && (nReq<0 ||
14d90 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
14da0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
14db0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
14dc0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  .      int rc;..
14dd0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63        /* For eac
14de0 68 20 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20  h pager, try to 
14df0 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67  free as many pag
14e00 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28  es as possible (
14e10 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a  without .      *
14e20 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28  * calling fsync(
14e30 29 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  ) if this is the
14e40 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
14e50 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
14e60 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  t .      ** loop
14e70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
14e80 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
14e90 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f  OK==(rc = pager_
14ea0 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20 26 70  recycle(p, i, &p
14eb0 50 67 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20  Pg)) && pPg) {. 
14ec0 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20         /* We've 
14ed0 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
14ee0 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
14ef0 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
14f00 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a   been .        *
14f10 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
14f20 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
14f30 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
14f40 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
14f50 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73         ** (pFirs
14f60 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20  tSynced). It is 
14f70 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c  still in the all
14f80 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69   pages (pAll) li
14f90 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  st. .        ** 
14fa0 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  Remove it from t
14fb0 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20  his list before 
14fc0 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20  freeing..       
14fd0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
14fe0 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
14ff0 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
15000 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
15010 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
15020 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
15030 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
15040 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
15050 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
15060 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
15070 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f  );.        page_
15080 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
15090 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
150a0 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e      if( pPg==p->
150b0 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
150c0 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67     p->pAll = pPg
150d0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
150e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
150f0 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70       for( pTmp=p
15100 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e  ->pAll; pTmp->pN
15110 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d  extAll!=pPg; pTm
15120 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p=pTmp->pNextAll
15130 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70   ){}.          p
15140 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  Tmp->pNextAll = 
15150 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
15160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15170 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71   nReleased += sq
15180 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50  liteAllocSize(pP
15190 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
151a0 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
151b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
151c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
151d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
151e0 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
151f0 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
15200 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15210 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   or .        ** 
15220 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72  journal in pager
15230 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20  _recycle(). The 
15240 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74  error is not ret
15250 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20  urned to the .  
15260 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
15270 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
15280 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
15290 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
152a0 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
152b0 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20     ** The error 
152c0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
152d0 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72   to the user (or
152e0 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63   users, in the c
152f0 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase .        ** 
15300 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65  of a shared page
15310 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20  r cache) of the 
15320 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20  pager for which 
15330 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65  the error occure
15340 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
15350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
15360 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
15370 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  | rc==SQLITE_FUL
15380 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  L );.        ass
15390 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50  ert( p->state>=P
153a0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
153b0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
153c0 72 72 6f 72 28 70 2c 20 72 63 29 3b 0a 20 20 20  rror(p, rc);.   
153d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
153e0 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73    return nReleas
153f0 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ed;.}.#endif /* 
15400 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
15410 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20  MORY_MANAGEMENT 
15420 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  */../*.** Acquir
15430 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
15440 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
15450 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
15460 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
15470 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
15480 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
15490 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
154a0 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
154b0 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
154c0 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  leased..**.** A 
154d0 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61  _get works for a
154e0 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
154f0 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
15500 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
15510 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
15520 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
15530 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
15540 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
15550 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
15560 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
15570 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
15580 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
15590 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
155a0 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
155b0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
155c0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
155d0 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
155e0 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
155f0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
15600 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
15610 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
15620 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
15630 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
15640 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
15650 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
15660 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
15670 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
15680 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
15690 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
156a0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
156b0 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29  e3pager_lookup()
156c0 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
156d0 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70  tine and _lookup
156e0 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
156f0 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
15700 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
15710 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
15720 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
15730 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
15740 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
15750 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
15760 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
15770 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a  reas _lookup().*
15780 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
15790 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
157a0 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
157b0 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
157c0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
157d0 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
157e0 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
157f0 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
15800 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
15810 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b  ..** Since _look
15820 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
15830 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
15840 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
15850 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
15860 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
15870 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
15880 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50 61  r_get(Pager *pPa
15890 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
158a0 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a  void **ppPage){.
158b0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
158c0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
158d0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
158e0 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
158f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
15900 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
15910 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
15920 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
15930 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73   zero, is reques
15940 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
15950 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
15960 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c  GNO || pgno==0 |
15970 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
15980 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
15990 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
159a0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
159b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
159c0 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
159d0 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
159e0 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
159f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15a00 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
15a10 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
15a20 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
15a30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
15a40 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
15a50 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
15a60 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
15a70 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
15a80 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
15a90 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
15aa0 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
15ab0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
15ac0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
15ad0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
15ae0 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20  ef==0 && !MEMDB 
15af0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
15b00 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
15b10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
15b20 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
15b30 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
15b40 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
15b50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15b60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15b70 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
15b80 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  er, rc);.      }
15b90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
15ba0 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
15bb0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
15bc0 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
15bd0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
15be0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
15bf0 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
15c00 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
15c10 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
15c20 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
15c30 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72    if( hasHotJour
15c40 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  nal(pPager) ){. 
15c50 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
15c60 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
15c70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
15c80 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
15c90 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
15ca0 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
15cb0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
15cc0 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
15cd0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
15ce0 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58  the.       ** EX
15cf0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
15d00 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
15d10 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
15d20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  open the.       
15d30 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
15d40 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
15d50 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
15d60 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
15d70 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  e.       ** data
15d80 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
15d90 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
15da0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
15db0 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
15dc0 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20      ** back..   
15dd0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a      ** .       *
15de0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
15df0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
15e00 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
15e10 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
15e20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
15e30 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
15e40 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
15e50 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
15e60 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a  ail to.       **
15e70 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e   obtain it's own
15e80 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
15e90 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15ea0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  file..       */.
15eb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15ec0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
15ed0 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
15ee0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66  LOCK);.       if
15ef0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15f00 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
15f10 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
15f20 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
15f30 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
15f40 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
15f50 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
15f60 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
15f70 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
15f80 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
15f90 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
15fa0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
15fb0 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70  E;..       /* Op
15fc0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
15fd0 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e  or reading only.
15fe0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
15ff0 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a  BUSY if.       *
16000 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  * we are unable 
16010 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
16020 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nal file. .     
16030 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54    **.       ** T
16040 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16050 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
16060 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c   be locked itsel
16070 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a  f.  The.       *
16080 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
16090 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c  s never open unl
160a0 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ess the main dat
160b0 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73  abase file holds
160c0 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69  .       ** a wri
160d0 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72  te lock, so ther
160e0 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63  e is never any c
160f0 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20  hance of two or 
16100 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70  more.       ** p
16110 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67  rocesses opening
16120 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20   the journal at 
16130 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20  the same time.. 
16140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
16150 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
16160 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65  enReadOnly(pPage
16170 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50  r->zJournal, &pP
16180 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
16190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
161a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
161b0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
161c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
161d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
161e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
161f0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
16200 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
16210 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
16220 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
16230 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
16240 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   1;.       pPage
16250 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
16260 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  d = 0;.       pP
16270 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
16280 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61   = 0;.       pPa
16290 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
162a0 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
162b0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
162c0 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c  0;..       /* Pl
162d0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
162e0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
162f0 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
16300 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a  e write.       *
16310 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
16320 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
16330 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ck..       */.  
16340 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
16350 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
16360 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
16370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16380 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
16390 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
163a0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d 0a  , rc);.       }.
163b0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
163c0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
163d0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61  /* Search for pa
163e0 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ge in cache */. 
163f0 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c     pPg = pager_l
16400 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
16410 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  no);.    if( MEM
16420 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  DB && pPager->st
16430 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
16440 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
16450 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
16460 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
16470 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
16480 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
16490 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
164a0 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
164b0 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
164c0 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e  t h;.    TEST_IN
164d0 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
164e0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
164f0 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
16500 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65  >mxPage || pPage
16510 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20  r->pFirst==0 || 
16520 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  MEMDB ){.      /
16530 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
16540 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
16550 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d   pPager->nPage>=
16560 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b  pPager->nHash ){
16570 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
16580 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65  esize_hash_table
16590 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20  (pPager,.       
165a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73      pPager->nHas
165b0 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50  h<256 ? 256 : pP
165c0 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a  ager->nHash*2);.
165d0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
165e0 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a  er->nHash==0 ){.
165f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16600 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
16610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16620 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
16630 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
16640 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61  zeof(*pPg) + pPa
16650 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20  ger->pageSize.  
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16670 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73 69              + si
16680 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67  zeof(u32) + pPag
16690 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20  er->nExtra.     
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42           + MEMDB
166c0 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72  *sizeof(PgHistor
166d0 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  y) );.      if( 
166e0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
166f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16700 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
16710 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
16720 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
16730 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  );.      if( MEM
16740 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  DB ){.        me
16750 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49  mset(PGHDR_TO_HI
16760 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  ST(pPg, pPager),
16770 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73   0, sizeof(PgHis
16780 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a  tory));.      }.
16790 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
167a0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
167b0 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20    pPg->pNextAll 
167c0 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a  = pPager->pAll;.
167d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
167e0 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ll = pPg;.      
167f0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
16800 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
16810 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  r->nPage>pPager-
16820 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20 20 20  >nMaxPage ){.   
16830 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
16840 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d 28  ger->nMaxPage==(
16850 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 31 29  pPager->nPage-1)
16860 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
16870 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a  er->nMaxPage++;.
16880 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
16890 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
168a0 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67  ger_recycle(pPag
168b0 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20  er, 1, &pPg);.  
168c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
168d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
168e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
168f0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
16900 28 70 50 67 29 20 3b 0a 20 20 20 20 7d 0a 20 20  (pPg) ;.    }.  
16910 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
16920 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  no;.    if( pPag
16930 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
16940 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
16950 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
16960 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16970 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
16980 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
16990 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
169a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
169b0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
169c0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
169d0 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
169e0 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
169f0 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
16a00 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
16a10 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
16a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16a30 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
16a40 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
16a50 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
16a60 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
16a70 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69  r->aInStmt && (i
16a80 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
16a90 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20  >stmtSize.      
16aa0 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65         && (pPage
16ab0 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f  r->aInStmt[pgno/
16ac0 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
16ad0 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
16ae0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
16af0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
16b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
16b10 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
16b20 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
16b30 20 20 7d 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61    }.    makeClea
16b40 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
16b50 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
16b60 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
16b70 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
16b80 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
16b90 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
16ba0 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
16bb0 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
16bc0 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
16bd0 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
16be0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
16bf0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
16c00 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
16c10 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44  unref(PGHDR_TO_D
16c20 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20  ATA(pPg));.     
16c30 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
16c40 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74  rCode;.      ret
16c50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
16c60 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
16c70 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74  he page with dat
16c80 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61  a, either by rea
16c90 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
16ca0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
16cb0 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e  le, or by settin
16cc0 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  g the entire pag
16cd0 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e to zero..    *
16ce0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
16cf0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
16d00 28 70 50 61 67 65 72 29 3c 28 69 6e 74 29 70 67  (pPager)<(int)pg
16d10 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20  no || MEMDB ){. 
16d20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
16d30 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
16d40 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
16d50 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
16d60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
16d70 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20  EMDB==0 );.     
16d80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
16d90 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
16da0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
16db0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
16dc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
16dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16de0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16df0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
16e00 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  d, PGHDR_TO_DATA
16e10 28 70 50 67 29 2c 0a 20 20 20 20 20 20 20 20 20  (pPg),.         
16e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
16e40 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
16e50 20 20 20 20 20 20 54 52 41 43 45 33 28 22 46 45        TRACE3("FE
16e60 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e  TCH %d page %d\n
16e70 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
16e80 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
16e90 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
16ea0 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
16eb0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
16ec0 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66  no, 3);.      if
16ed0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16ee0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 66  ){.        i64 f
16ef0 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ileSize;.       
16f00 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74   int rc2 = sqlit
16f10 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
16f20 67 65 72 2d 3e 66 64 2c 20 26 66 69 6c 65 53 69  ger->fd, &fileSi
16f30 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ze);.        if(
16f40 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
16f50 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e  || fileSize>=pgn
16f60 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  o*pPager->pageSi
16f70 7a 65 20 29 7b 0a 09 20 20 2f 2a 20 41 6e 20 49  ze ){..  /* An I
16f80 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  O error occured 
16f90 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68  in one of the th
16fa0 65 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  e sqlite3OsSeek(
16fb0 29 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ) or.          *
16fc0 2a 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  * sqlite3OsRead(
16fd0 29 20 63 61 6c 6c 73 20 61 62 6f 76 65 2e 20 2a  ) calls above. *
16fe0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  /.          pPg-
16ff0 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  >pgno = 0;.     
17000 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
17010 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
17020 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
17030 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17040 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
17050 0a 20 20 20 20 20 20 20 20 20 20 63 6c 65 61 72  .          clear
17060 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
17070 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ror();.         
17080 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
17090 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
170a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
170b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
170c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
170d0 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
170e0 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  r->nRead);.     
170f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
17100 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69   Link the page i
17110 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68 61 73  nto the page has
17120 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68  h table */.    h
17130 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65   = pgno & (pPage
17140 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
17150 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
17160 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   );.    pPg->pNe
17170 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
17180 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70  >aHash[h];.    p
17190 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
171a0 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
171b0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
171c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
171d0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
171e0 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
171f0 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
17200 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
17210 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66   pPg;.    }..#if
17220 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
17230 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
17240 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
17250 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
17260 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
17270 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
17280 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
17290 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
172a0 2a 2f 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52  */.    TEST_INCR
172b0 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
172c0 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
172d0 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
172e0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
172f0 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
17300 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17310 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
17320 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
17330 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
17340 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
17350 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
17360 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
17370 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
17380 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
17390 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
173a0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
173b0 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
173c0 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  so sqlite3pager_
173d0 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  get().  The diff
173e0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
173f0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
17400 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nd sqlite3pager_
17410 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  get() is that _g
17420 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
17430 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
17440 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
17450 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
17460 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
17470 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
17480 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
17490 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
174a0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
174b0 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
174c0 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
174d0 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
174e0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70 61  .void *sqlite3pa
174f0 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
17500 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
17510 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
17520 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
17530 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
17540 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
17550 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
17560 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
17570 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
17580 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
17590 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50  turn 0;.  }.  pP
175a0 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
175b0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
175c0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72    if( pPg==0 ) r
175d0 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f  eturn 0;.  page_
175e0 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
175f0 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
17600 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
17610 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
17620 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
17630 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
17640 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
17650 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
17660 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
17670 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
17680 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
17690 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
176a0 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
176b0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
176c0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
176d0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
176e0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
176f0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
17700 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
17710 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  f(void *pData){.
17720 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
17730 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
17740 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
17750 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
17760 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54    */.  pPg = DAT
17770 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
17780 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
17790 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50  ->nRef>0 );.  pP
177a0 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46  g->nRef--;.  REF
177b0 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48  INFO(pPg);..  CH
177c0 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
177d0 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
177e0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
177f0 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
17800 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
17810 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
17820 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
17830 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
17840 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
17850 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
17860 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
17870 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
17880 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
17890 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
178a0 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
178b0 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
178c0 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
178d0 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
178e0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
178f0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
17900 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
17910 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
17920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17930 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
17940 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
17950 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
17960 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
17970 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
17980 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
17990 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
179a0 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
179b0 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
179c0 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
179d0 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
179e0 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65  tor(pData, pPage
179f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17a00 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
17a10 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
17a20 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
17a30 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
17a40 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
17a50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17a60 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
17a70 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
17a80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17a90 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
17aa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
17ab0 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29  f==0 && !MEMDB )
17ac0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
17ad0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
17ae0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17af0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17b00 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75  .** Create a jou
17b10 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50  rnal file for pP
17b20 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f  ager.  There sho
17b30 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61  uld already be a
17b40 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20   RESERVED.** or 
17b50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
17b60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
17b70 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
17b80 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
17b90 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
17ba0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
17bb0 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61  thing.  Return a
17bc0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
17bd0 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20   release the.** 
17be0 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e  write lock if an
17bf0 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
17c00 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
17c10 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
17c20 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
17c30 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
17c40 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
17c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
17c60 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
17c70 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
17c80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
17c90 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
17ca0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17cb0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
17cc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17cd0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
17ce0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67   );.  sqlite3pag
17cf0 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
17d00 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
17d10 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  aInJournal = sql
17d20 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
17d30 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
17d40 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
17d50 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
17d60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
17d70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
17d80 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
17d90 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
17da0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
17db0 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
17dc0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
17dd0 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20  Pager->jfd,.    
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
17e00 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
17e10 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
17e20 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
17e30 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
17e40 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
17e50 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69  rnalHdr = 0;.  i
17e60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17e70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69   ){.    goto fai
17e80 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
17e90 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nal;.  }.  sqlit
17ea0 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
17eb0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
17ec0 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29  ger->full_fsync)
17ed0 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74  ;.  sqlite3OsSet
17ee0 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
17ef0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  >fd, pPager->ful
17f00 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69  l_fsync);.  sqli
17f10 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f  te3OsOpenDirecto
17f20 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ry(pPager->jfd, 
17f30 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
17f40 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ry);.  pPager->j
17f50 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
17f60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
17f70 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
17f80 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
17f90 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17fa0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
17fb0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
17fc0 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ec = 0;.  if( pP
17fd0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
17fe0 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
17ff0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67  ->errCode;.    g
18000 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
18010 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
18020 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
18030 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
18040 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77  bSize;..  rc = w
18050 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
18060 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
18070 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
18080 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
18090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
180a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
180b0 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29  mt_begin(pPager)
180c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
180d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
180e0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
180f0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
18100 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
18110 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
18120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18130 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18140 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
18150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61    return rc;..fa
18160 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
18170 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72  rnal:.  sqliteFr
18180 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
18190 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
181a0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
181b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
181c0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
181d0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
181e0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
181f0 65 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  e, then we will 
18200 6e 6f 74 20 62 65 20 63 6c 6f 73 69 6e 67 20 74  not be closing t
18210 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
18220 66 69 6c 65 2e 20 53 6f 20 64 65 6c 65 74 65 20  file. So delete 
18230 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
18240 20 77 65 20 6d 61 79 20 68 61 76 65 20 6a 75 73   we may have jus
18250 74 20 63 72 65 61 74 65 64 2e 20 4f 74 68 65 72  t created. Other
18260 77 69 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  wise,.    ** the
18270 20 73 79 73 74 65 6d 20 77 69 6c 6c 20 67 65 74   system will get
18280 20 63 6f 6e 66 75 73 65 64 2c 20 77 65 20 68 61   confused, we ha
18290 76 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  ve a read-lock o
182a0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 61  n the file and a
182b0 0a 20 20 20 20 2a 2a 20 6d 79 73 74 65 72 69 6f  .    ** mysterio
182c0 75 73 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  us journal has a
182d0 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20 66  ppeared in the f
182e0 69 6c 65 73 79 73 74 65 6d 2e 0a 20 20 20 20 2a  ilesystem..    *
182f0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  /.    sqlite3OsD
18300 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
18310 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 65 6c 73 65  ournal);.  }else
18320 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55  {.    sqlite3OsU
18330 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
18340 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
18350 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
18360 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
18370 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18380 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
18390 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
183a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
183b0 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
183c0 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
183d0 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
183e0 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
183f0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
18400 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20  ger_commit() is 
18410 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
18420 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
18430 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
18440 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
18450 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20  e3pager_close() 
18460 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
18470 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
18480 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  unref() is calle
18490 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
184a0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
184b0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
184c0 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
184d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
184e0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
184f0 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
18500 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
18510 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
18520 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
18530 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
18540 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
18550 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
18560 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
18570 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
18580 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
18590 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
185a0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
185b0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
185c0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
185d0 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
185e0 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
185f0 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
18600 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
18610 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
18620 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
18630 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
18640 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
18650 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
18660 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
18670 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
18680 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
18690 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
186a0 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
186b0 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
186c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
186d0 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
186e0 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
186f0 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
18700 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
18710 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
18720 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
18730 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
18740 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
18750 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
18760 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20  **.** If exFlag 
18770 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61  is true, go ahea
18780 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43  d and get an EXC
18790 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
187a0 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64  he file.** immed
187b0 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f  iately instead o
187c0 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20  f waiting until 
187d0 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20  we try to flush 
187e0 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a  the cache.  The.
187f0 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e  ** exFlag is ign
18800 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61  ored if a transa
18810 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
18820 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
18830 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67  sqlite3pager_beg
18840 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  in(void *pData, 
18850 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
18860 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
18870 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
18880 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
18890 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
188a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
188b0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
188c0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
188d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
188e0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
188f0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
18900 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
18910 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
18920 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18930 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
18940 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
18950 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
18960 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
18970 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
18980 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
18990 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
189a0 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
189b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
189c0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
189d0 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
189e0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
189f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18a00 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
18a10 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
18a20 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20  ESERVED;.       
18a30 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20   if( exFlag ){. 
18a40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
18a50 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
18a60 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
18a70 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
18a80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18a90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18aa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
18ab0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18ac0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
18ad0 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
18ae0 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54 52        TRACE2("TR
18af0 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
18b00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
18b10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
18b20 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
18b30 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
18b40 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
18b50 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
18b60 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
18b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18b80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18b90 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
18ba0 70 61 67 65 20 64 69 72 74 79 2e 20 20 53 65 74  page dirty.  Set
18bb0 20 69 74 73 20 64 69 72 74 79 20 66 6c 61 67 20   its dirty flag 
18bc0 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74 68  and add it to th
18bd0 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20  e dirty.** page 
18be0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
18bf0 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50  void makeDirty(P
18c00 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
18c10 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
18c20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
18c30 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
18c40 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72  er;.    pPg->dir
18c50 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d  ty = 1;.    pPg-
18c60 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72  >pDirty = pPager
18c70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69 66  ->pDirty;.    if
18c80 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  ( pPager->pDirty
18c90 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
18ca0 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44  ->pDirty->pPrevD
18cb0 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20  irty = pPg;.    
18cc0 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  }.    pPg->pPrev
18cd0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
18ce0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
18cf0 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pPg;.  }.}../*.*
18d00 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c  * Make a page cl
18d10 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20  ean.  Clear its 
18d20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20 72 65  dirty bit and re
18d30 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
18d40 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c  .** dirty page l
18d50 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
18d60 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67  oid makeClean(Pg
18d70 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
18d80 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20   pPg->dirty ){. 
18d90 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
18da0 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  0;.    if( pPg->
18db0 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  pDirty ){.      
18dc0 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72  pPg->pDirty->pPr
18dd0 65 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  evDirty = pPg->p
18de0 50 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d  PrevDirty;.    }
18df0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
18e00 72 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20  revDirty ){.    
18e10 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74    pPg->pPrevDirt
18e20 79 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d  y->pDirty = pPg-
18e30 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
18e40 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
18e50 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
18e60 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
18e70 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
18e80 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
18e90 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
18ea0 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
18eb0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
18ec0 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
18ed0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
18ee0 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
18ef0 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
18f00 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
18f10 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
18f20 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
18f30 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
18f40 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
18f50 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
18f60 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
18f70 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
18f80 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  res a RESERVED l
18f90 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
18fa0 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53  ase.  If the RES
18fb0 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  ERVED.** lock co
18fc0 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69  uld not be acqui
18fd0 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
18fe0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
18ff0 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63  _BUSY.  The.** c
19000 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d  alling routine m
19010 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68  ust check for th
19020 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  at return value 
19030 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
19040 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20  ot to.** change 
19050 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
19060 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  til this routine
19070 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
19080 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
19090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
190a0 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74  uld not be writt
190b0 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64  en because the d
190c0 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20  isk is full,.** 
190d0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
190e0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
190f0 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61  _FULL and does a
19100 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c  n immediate roll
19110 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62  back..** All sub
19120 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74  sequent write at
19130 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75  tempts also retu
19140 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75  rn SQLITE_FULL u
19150 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ntil there.** is
19160 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
19170 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e3pager_commit()
19180 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67 65 72   or sqlite3pager
19190 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  _rollback() to.*
191a0 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20  * reset..*/.int 
191b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
191c0 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  te(void *pData){
191d0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
191e0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
191f0 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
19200 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
19210 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
19220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
19230 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72   Check for error
19240 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
19250 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20  ger->errCode ){ 
19260 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
19270 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
19280 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
19290 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
192a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
192b0 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  M;.  }..  assert
192c0 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
192d0 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b  ster );..  CHECK
192e0 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
192f0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
19300 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
19310 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
19320 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
19330 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
19340 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
19350 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
19360 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44 69  y..  */.  makeDi
19370 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
19380 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
19390 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c  & (pPg->inStmt |
193a0 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  | pPager->stmtIn
193b0 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  Use==0) ){.    p
193c0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
193d0 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
193e0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
193f0 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
19400 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
19410 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
19420 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
19430 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
19440 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
19450 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
19460 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
19470 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
19480 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
19490 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
194a0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
194b0 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
194c0 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
194d0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
194e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
194f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
19500 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
19510 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
19520 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61  ager_begin(pData
19530 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
19540 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19550 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19560 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19570 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
19580 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
19590 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
195a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
195b0 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
195c0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
195d0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
195e0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
195f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19600 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
19610 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
19620 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
19630 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
19640 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
19650 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
19660 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
19670 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
19680 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
19690 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
196a0 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
196b0 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
196c0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
196d0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
196e0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
196f0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
19700 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
19710 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
19720 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
19730 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
19740 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19750 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
19760 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65   && (pPager->use
19770 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42  Journal || MEMDB
19780 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
19790 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
197a0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
197b0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
197c0 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  nt szPg;.       
197d0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
197e0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
197f0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
19800 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
19810 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
19820 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c   TRACE3("JOURNAL
19830 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
19840 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
19850 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
19860 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19870 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
19880 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
19890 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
198a0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
198b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
198c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48            if( pH
198d0 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
198e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
198f0 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50  (pHist->pOrig, P
19900 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
19910 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
19920 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
19930 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
19940 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
19950 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20  ksum, saved;.   
19960 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
19970 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  ta2, *pEnd;.    
19980 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
19990 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
199a0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
199b0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
199c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
199d0 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
199e0 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
199f0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
19a00 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
19a10 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
19a20 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
19a30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
19a40 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
19a50 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
19a60 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
19a70 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
19a80 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
19a90 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
19aa0 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
19ab0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
19ac0 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
19ad0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61        pEnd = pDa
19ae0 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  ta2 + pPager->pa
19af0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
19b00 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20    pData2 -= 4;. 
19b10 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d           saved =
19b20 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20   *(u32*)pEnd;.  
19b30 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
19b40 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a  s(pEnd, cksum);.
19b50 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d            szPg =
19b60 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19b70 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70  e+8;.          p
19b80 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c  ut32bits(pData2,
19b90 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
19ba0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19bb0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
19bc0 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
19bd0 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  szPg);.         
19be0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19bf0 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20  Off += szPg;.   
19c00 20 20 20 20 20 20 20 54 52 41 43 45 34 28 22 4a         TRACE4("J
19c10 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
19c20 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
19c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19c40 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
19c50 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
19c60 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
19c70 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a            *(u32*
19c80 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a  )pEnd = saved;..
19c90 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68  .  /* An error h
19ca0 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69  as occured writi
19cb0 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
19cc0 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
19cd0 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
19ce0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
19cf0 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
19d00 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
19d10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
19d20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
19d30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19d40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19d50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
19d60 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19d70 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
19d80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19d90 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
19da0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
19db0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
19dc0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
19dd0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
19de0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  ;.          pPg-
19df0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
19e00 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
19e10 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
19e20 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
19e30 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
19e40 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
19e50 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
19e60 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
19e70 20 20 20 20 20 20 20 20 20 20 70 61 67 65 5f 61            page_a
19e80 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
19e90 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
19ea0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
19eb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19ec0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
19ed0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
19ee0 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
19ef0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
19f00 20 20 20 20 20 54 52 41 43 45 34 28 22 41 50 50       TRACE4("APP
19f10 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
19f20 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
19f40 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
19f50 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
19f60 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
19f70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
19f80 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
19f90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
19fa0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
19fb0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69    }.      pPg->i
19fc0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
19fd0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
19fe0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
19ff0 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
1a000 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
1a010 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
1a020 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
1a030 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
1a040 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1a050 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
1a060 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
1a070 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
1a080 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
1a090 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
1a0a0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
1a0b0 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
1a0c0 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
1a0d0 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
1a0e0 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
1a0f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1a100 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
1a110 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
1a120 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
1a130 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
1a140 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1a150 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
1a160 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
1a170 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1a180 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
1a190 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
1a1a0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1a1b0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1a1c0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1a1d0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
1a1e0 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t->pStmt==0 );. 
1a1f0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
1a200 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tmt = sqliteMall
1a210 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
1a220 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
1a230 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
1a240 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
1a250 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
1a260 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Stmt, PGHDR_TO_D
1a270 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
1a280 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1a290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
1a2a0 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
1a2b0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1a2c0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1a2d0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1a2e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a2f0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1a300 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1a310 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1a320 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20  gno, 7)-4;.     
1a330 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61     put32bits(pDa
1a340 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ta2, pPg->pgno);
1a350 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1a360 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1a370 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61  ger->stfd, pData
1a380 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
1a390 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  ize+4);.        
1a3a0 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
1a3b0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1a3c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1a3d0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
1a3e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1a3f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1a410 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1a420 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
1a430 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  tNRec++;.       
1a440 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a450 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
1a460 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
1a470 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1a480 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1a490 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d  pgno&7);.      }
1a4a0 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
1a4b0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1a4c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1a4d0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
1a4e0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
1a4f0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
1a500 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1a510 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
1a520 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1a530 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
1a540 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  no;.    if( !MEM
1a550 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
1a560 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
1a570 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
1a580 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
1a590 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
1a5a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a5b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1a5c0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1a5d0 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
1a5e0 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
1a5f0 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
1a600 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
1a610 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20  pager_write().  
1a620 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1a630 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
1a640 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
1a650 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
1a660 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
1a670 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1a680 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1a690 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69  _iswriteable(voi
1a6a0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
1a6b0 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
1a6c0 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
1a6d0 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
1a6e0 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  rty;.}.#endif..#
1a6f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a700 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
1a710 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
1a720 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
1a730 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
1a740 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
1a750 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
1a760 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1a770 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74  e3pager_overwrit
1a780 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1a790 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
1a7a0 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64   *pData){.  void
1a7b0 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72   *pPage;.  int r
1a7c0 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
1a7d0 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
1a7e0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  er, pgno, &pPage
1a7f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1a800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1a810 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1a820 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
1a830 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a840 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
1a850 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61  cpy(pPage, pData
1a860 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1a870 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ze);.    }.    s
1a880 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
1a890 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  f(pPage);.  }.  
1a8a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1a8b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
1a8c0 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
1a8d0 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
1a8e0 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
1a8f0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
1a900 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
1a910 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22  mation on page "
1a920 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68  pgno" back to th
1a930 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
1a940 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
1a950 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
1a960 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
1a970 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
1a980 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
1a990 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
1a9a0 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
1a9b0 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
1a9c0 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
1a9d0 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
1a9e0 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
1a9f0 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
1aa00 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
1aa10 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
1aa20 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
1aa30 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
1aa40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
1aa50 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
1aa60 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
1aa70 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1aa80 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
1aa90 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
1aaa0 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
1aab0 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
1aac0 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
1aad0 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
1aae0 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
1aaf0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
1ab00 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
1ab10 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
1ab20 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
1ab30 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
1ab40 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
1ab50 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
1ab60 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
1ab70 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
1ab80 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
1ab90 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
1aba0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
1abb0 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
1abc0 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
1abd0 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
1abe0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
1abf0 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
1ac00 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
1ac10 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
1ac20 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
1ac30 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
1ac40 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
1ac50 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
1ac60 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
1ac70 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1ac80 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
1ac90 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
1aca0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
1acb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1acc0 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
1acd0 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f  eused,.** the do
1ace0 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  nt_rollback() ro
1acf0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1ad00 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
1ad10 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a  e page contains.
1ad20 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ** critical data
1ad30 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
1ad40 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
1ad50 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ts rolled back i
1ad60 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68  n spite.** of th
1ad70 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
1ad80 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
1ad90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
1ada0 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  t_write(Pager *p
1adb0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1adc0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1add0 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20  ..  if( MEMDB ) 
1ade0 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d  return;..  pPg =
1adf0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
1ae00 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
1ae10 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b  ssert( pPg!=0 );
1ae20 20 20 2f 2a 20 57 65 20 6e 65 76 65 72 20 63 61    /* We never ca
1ae30 6c 6c 20 5f 64 6f 6e 74 5f 77 72 69 74 65 20 75  ll _dont_write u
1ae40 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 20 69  nless the page i
1ae50 73 20 69 6e 20 6d 65 6d 20 2a 2f 0a 20 20 70 50  s in mem */.  pP
1ae60 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1ae70 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  k = 1;.  if( pPg
1ae80 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67  ->dirty && !pPag
1ae90 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1aea0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1aeb0 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50  >dbSize==(int)pP
1aec0 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65  g->pgno && pPage
1aed0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50  r->origDbSize<pP
1aee0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
1aef0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1af00 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61   pages is the la
1af10 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  st page in the f
1af20 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
1af30 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20   has grown.     
1af40 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63   ** during the c
1af50 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
1af60 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20  on, then do NOT 
1af70 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
1af80 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a   clean..      **
1af90 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   When the databa
1afa0 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77  se file grows, w
1afb0 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65  e must make sure
1afc0 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
1afd0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74  age.      ** get
1afe0 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61  s written at lea
1aff0 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20  st once so that 
1b000 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69  the disk file wi
1b010 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63  ll be the correc
1b020 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e  t.      ** size.
1b030 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77   If you do not w
1b040 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61  rite this page a
1b050 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
1b060 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
1b070 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64   on the disk end
1b080 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73  s up being too s
1b090 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c  mall, that can l
1b0a0 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a  ead to database.
1b0b0 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74        ** corrupt
1b0c0 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e  ion during the n
1b0d0 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ext transaction.
1b0e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
1b0f0 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45  lse{.      TRACE
1b100 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
1b110 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
1b120 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
1b130 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 6d 61  ager));.      ma
1b140 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69  keClean(pPg);.#i
1b150 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1b160 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
1b170 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
1b180 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1b190 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
1b1a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63    }.}../*.** A c
1b1b0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1b1c0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1b1d0 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
1b1e0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
1b1f0 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
1b200 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
1b210 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
1b220 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
1b230 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
1b240 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
1b250 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
1b260 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
1b270 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
1b280 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
1b290 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
1b2a0 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
1b2b0 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
1b2c0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
1b2d0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
1b2e0 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
1b2f0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1b300 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  r;..  if( pPager
1b310 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 45  ->state!=PAGER_E
1b320 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61 67  XCLUSIVE || pPag
1b330 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1b340 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1b350 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
1b360 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
1b370 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1b380 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75   || MEMDB ) retu
1b390 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
1b3a0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
1b3b0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
1b3c0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1b3d0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1b3e0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1b3f0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
1b400 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1b410 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1b420 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1b430 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
1b440 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
1b450 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1b460 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
1b470 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1b480 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1b490 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1b4a0 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
1b4b0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1b4c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
1b4d0 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
1b4e0 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
1b4f0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
1b500 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1b510 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1b520 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
1b530 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
1b540 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
1b550 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1b560 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b570 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
1b580 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
1b590 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
1b5a0 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
1b5b0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
1b5c0 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  mt!=0 );.    pPa
1b5d0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1b5e0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1b5f0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1b600 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
1b610 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
1b620 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   }.}.../*.** Com
1b630 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
1b640 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b650 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
1b660 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
1b670 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
1b680 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
1b690 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
1b6a0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
1b6b0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
1b6c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1b6d0 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
1b6e0 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
1b6f0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
1b700 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1b710 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50  e3pager_commit(P
1b720 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b730 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
1b740 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
1b750 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1b760 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1b770 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1b780 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1b790 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
1b7a0 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
1b7b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
1b7c0 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4f    }.  TRACE2("CO
1b7d0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1b7e0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1b7f0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1b800 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1b810 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1b820 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77 68  (pPager);.    wh
1b830 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20 20  ile( pPg ){.    
1b840 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50    clearHistory(P
1b850 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1b860 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  , pPager));.    
1b870 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1b880 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
1b890 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1b8a0 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
1b8b0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
1b8c0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
1b8d0 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
1b8e0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1b8f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
1b900 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
1b910 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1b920 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69  ->pDirty = 0;.#i
1b930 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
1b940 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
1b950 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
1b960 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
1b970 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1b980 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1b990 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1b9a0 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
1b9b0 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
1b9c0 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
1b9d0 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
1b9e0 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
1b9f0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
1ba00 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
1ba10 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
1ba20 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1ba30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1ba40 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
1ba50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ba60 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1ba70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1ba80 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==0 ){.    /* E
1ba90 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f  xit early (witho
1baa0 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d  ut doing the tim
1bab0 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69  e-consuming sqli
1bac0 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c  te3OsSync() call
1bad0 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  s).    ** if the
1bae0 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
1baf0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
1bb00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1bb10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1bb20 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  ger->needSync==0
1bb30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
1bb40 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1bb50 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1bb60 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1bb70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1bb80 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1bb90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1bba0 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
1bbb0 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50  te3pager_sync(pP
1bbc0 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69  ager, 0, 0);.  i
1bbd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bbe0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1bbf0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1bc00 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1bc10 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1bc20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1bc30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1bc40 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
1bc50 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
1bc60 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
1bc70 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
1bc80 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
1bc90 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
1bca0 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
1bcb0 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
1bcc0 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
1bcd0 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
1bce0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1bcf0 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
1bd00 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1bd10 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
1bd20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
1bd30 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
1bd40 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54   protocol (SQLIT
1bd50 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75  E_PROTOCOL) or u
1bd60 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1bd70 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
1bd80 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
1bd90 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1bda0 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
1bdb0 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
1bdc0 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
1bdd0 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
1bde0 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
1bdf0 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
1be00 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
1be10 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
1be20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
1be30 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
1be40 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1be50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1be60 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  ager_rollback(Pa
1be70 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1be80 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32  int rc;.  TRACE2
1be90 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
1bea0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1beb0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1bec0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1bed0 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
1bee0 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
1bef0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
1bf00 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1bf10 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
1bf20 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
1bf30 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
1bf40 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
1bf50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1bf60 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
1bf70 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1bf80 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
1bf90 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1bfa0 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
1bfb0 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
1bfc0 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
1bfd0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
1bfe0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
1bff0 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
1c000 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1c010 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1c020 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
1c030 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1c040 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1c050 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
1c060 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c070 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  e);.        TRAC
1c080 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
1c090 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
1c0a0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1c0b0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1c0c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
1c0d0 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69  RACE3("PAGE %d i
1c0e0 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22  s clean on %d\n"
1c0f0 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
1c100 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1c110 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
1c120 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
1c130 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
1c140 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
1c150 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1c160 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b    p->inStmt = 0;
1c170 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53  .      p->pPrevS
1c180 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74  tmt = p->pNextSt
1c190 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  mt = 0;.      if
1c1a0 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
1c1b0 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ter ){.        p
1c1c0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
1c1d0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1c1e0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1c1f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
1c200 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
1c210 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
1c220 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1c230 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
1c240 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1c250 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20  origDbSize;.    
1c260 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
1c270 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1c280 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1c290 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1c2a0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1c2b0 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
1c2c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1c2d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
1c2e0 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
1c2f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1c300 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
1c310 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
1c320 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
1c330 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1c340 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1c350 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
1c360 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
1c370 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
1c380 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
1c390 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1c3a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
1c3b0 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
1c3c0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
1c3d0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
1c3e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1c3f0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
1c400 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1c410 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
1c420 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
1c430 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1c440 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
1c450 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  ger);.    rc2 = 
1c460 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1c470 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
1c480 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c490 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
1c4a0 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
1c4b0 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
1c4c0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
1c4d0 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  r);.  }.  pPager
1c4e0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a  ->dbSize = -1;..
1c4f0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
1c500 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
1c510 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
1c520 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
1c530 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  t the pager.  **
1c540 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
1c550 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
1c560 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
1c570 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
1c580 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
1c590 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  .  */.  return p
1c5a0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1c5b0 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
1c5c0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1c5d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c5e0 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
1c5f0 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
1c600 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
1c610 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
1c620 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
1c630 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1c640 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
1c650 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1c660 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1c670 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
1c680 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1c690 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
1c6a0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ces to the pager
1c6b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c6c0 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 28 50  pager_refcount(P
1c6d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1c6e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1c6f0 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  nRef;.}..#ifdef 
1c700 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
1c710 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1c720 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
1c730 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
1c740 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
1c750 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73  lite3pager_stats
1c760 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1c770 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
1c780 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50  11];.  a[0] = pP
1c790 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b  ager->nRef;.  a[
1c7a0 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61  1] = pPager->nPa
1c7b0 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61  ge;.  a[2] = pPa
1c7c0 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61  ger->mxPage;.  a
1c7d0 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
1c7e0 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
1c7f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
1c800 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
1c810 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
1c820 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
1c830 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
1c840 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
1c850 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20  pPager->nOvfl;. 
1c860 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[9] = pPager->
1c870 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d  nRead;.  a[10] =
1c880 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b   pPager->nWrite;
1c890 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23  .  return a;.}.#
1c8a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
1c8b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
1c8c0 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a  ollback point..*
1c8d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1c8e0 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
1c8f0 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
1c900 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1c910 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
1c920 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e    A new statemen
1c930 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
1c940 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
1c950 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
1c960 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
1c970 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
1c980 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
1c990 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
1c9a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c9b0 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e  pager_stmt_begin
1c9c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1c9d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1c9e0 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
1c9f0 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20  EMPNAME_SIZE];. 
1ca00 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1ca10 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
1ca20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ca30 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20  >dbSize>=0 );.  
1ca40 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47  TRACE2("STMT-BEG
1ca50 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IN %d\n", PAGERI
1ca60 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
1ca70 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
1ca80 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1ca90 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1caa0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
1cab0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1cac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cad0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  K;.  }.  if( !pP
1cae0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1caf0 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
1cb00 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
1cb10 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1cb20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1cb30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1cb40 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
1cb50 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1cb60 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1cb70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
1cb80 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
1cb90 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30  ager->aInStmt==0
1cba0 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
1cbb0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1cbc0 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
1cbd0 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
1cbe0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1cbf0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1cc00 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  G.  rc = sqlite3
1cc10 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1cc20 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
1cc30 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
1cc40 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
1cc50 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
1cc60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cc70 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70  ->stmtJSize == p
1cc80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1cc90 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50  f );.#endif.  pP
1cca0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
1ccb0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
1ccc0 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
1ccd0 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
1cce0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61  r->dbSize;.  pPa
1ccf0 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
1cd00 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
1cd10 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65  tmtCksum = pPage
1cd20 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
1cd30 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  if( !pPager->stm
1cd40 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  tOpen ){.    rc 
1cd50 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f  = sqlite3pager_o
1cd60 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26  pentemp(zTemp, &
1cd70 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
1cd80 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
1cd90 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
1cda0 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ed;.    pPager->
1cdb0 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  stmtOpen = 1;.  
1cdc0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1cdd0 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ec = 0;.  }.  pP
1cde0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1cdf0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
1ce00 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f  LITE_OK;. .stmt_
1ce10 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20  begin_failed:.  
1ce20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
1ce30 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tmt ){.    sqlit
1ce40 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
1ce50 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67  nStmt);.    pPag
1ce60 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
1ce70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ce80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1ce90 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  t a statement..*
1cea0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1ceb0 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50  er_stmt_commit(P
1cec0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ced0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1cee0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67  tInUse ){.    Pg
1cef0 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
1cf00 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54  ;.    TRACE2("ST
1cf10 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  MT-COMMIT %d\n",
1cf20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1cf30 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  );.    if( !MEMD
1cf40 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  B ){.      sqlit
1cf50 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
1cf60 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  >stfd, 0);.     
1cf70 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75   /* sqlite3OsTru
1cf80 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74  ncate(pPager->st
1cf90 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
1cfa0 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
1cfb0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a  ger->aInStmt );.
1cfc0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1cfd0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
1cfe0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
1cff0 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
1d000 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
1d010 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
1d020 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
1d030 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1d040 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
1d050 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
1d060 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
1d070 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
1d080 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1d090 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1d0a0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1d0b0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1d0c0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1d0d0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
1d0e0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
1d0f0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48  tmt);.        pH
1d100 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
1d110 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d120 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1d130 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
1d140 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1d150 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1d160 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
1d170 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1d180 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
1d190 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d1a0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1d1b0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
1d1c0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1d1d0 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50  _stmt_rollback(P
1d1e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1d1f0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
1d200 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1d210 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22   ){.    TRACE2("
1d220 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
1d230 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1d240 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  ger));.    if( M
1d250 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
1d260 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
1d270 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1d280 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
1d290 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  pPg->pNextStmt){
1d2a0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1d2b0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1d2c0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1d2d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1d2e0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1d2f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1d300 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
1d310 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
1d320 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
1d330 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1d340 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1d350 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
1d360 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1d370 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1d380 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1d390 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1d3a0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
1d3b0 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72  ize;.      memor
1d3c0 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
1d3d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1d3e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1d3f0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
1d400 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
1d410 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1d420 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
1d430 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
1d440 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
1d450 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1d460 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
1d470 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1d480 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1d490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d4a0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
1d4b0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1d4c0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
1d4d0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1d4e0 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50  pager_filename(P
1d4f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1d500 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1d510 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
1d520 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1d530 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
1d540 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1d550 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1d560 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e 61  lite3pager_dirna
1d570 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1d580 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1d590 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a  er->zDirectory;.
1d5a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1d5b0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
1d5c0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1d5d0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1d5e0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1d5f0 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  er_journalname(P
1d600 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1d610 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1d620 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
1d630 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1d640 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
1d650 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
1d660 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
1d670 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
1d680 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
1d690 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
1d6a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1d6b0 61 67 65 72 5f 6e 6f 73 79 6e 63 28 50 61 67 65  ager_nosync(Page
1d6c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1d6d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
1d6e0 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ync;.}../*.** Se
1d6f0 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  t the codec for 
1d700 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
1d710 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
1d720 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67  set_codec(.  Pag
1d730 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
1d740 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
1d750 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
1d760 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
1d770 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
1d780 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
1d790 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
1d7a0 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
1d7b0 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  cArg;.}../*.** T
1d7c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1d7d0 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
1d7e0 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
1d7f0 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
1d800 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
1d810 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
1d820 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
1d830 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d840 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1d850 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
1d860 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67  r){.  void *pPag
1d870 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  e;.  PgHdr *pPgH
1d880 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
1d890 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
1d8a0 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70  rc;..  /* Open p
1d8b0 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
1d8c0 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
1d8d0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1d8e0 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
1d8f0 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , 1, &pPage);.  
1d900 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d910 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1d920 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1d930 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1d940 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1d950 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1d960 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
1d970 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
1d980 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  t byte 24. */.  
1d990 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f  pPgHdr = DATA_TO
1d9a0 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20  _PGHDR(pPage);. 
1d9b0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1d9c0 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
1d9d0 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20  (pPgHdr, 24);.. 
1d9e0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1d9f0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1da00 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1da10 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1da20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1da30 74 65 72 2b 2b 3b 0a 20 20 70 75 74 33 32 62 69  ter++;.  put32bi
1da40 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44 52  ts(((char*)PGHDR
1da50 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29  _TO_DATA(pPgHdr)
1da60 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1da70 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  nter);..  /* Rel
1da80 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
1da90 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71  ference. */.  sq
1daa0 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1dab0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
1dac0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1dad0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
1dae0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
1daf0 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
1db00 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
1db10 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
1db20 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
1db30 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
1db40 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
1db50 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
1db60 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
1db70 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
1db80 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
1db90 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
1dba0 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
1dbb0 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
1dbc0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
1dbd0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
1dbe0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
1dbf0 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
1dc00 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20  rnal is synced, 
1dc10 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1dc20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68  written.** to th
1dc30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1dc40 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1dc50 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68   file synced. Th
1dc60 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
1dc70 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20  t.** remains to 
1dc80 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
1dc90 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c  action is to del
1dca0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
1dcb0 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74  file (or.** mast
1dcc0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1dcd0 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
1dce0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
1dcf0 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
1dd00 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
1dd10 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
1dd20 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
1dd30 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
1dd40 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63 61  3pager_sync() ca
1dd50 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ll..**.** If par
1dd60 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73  ameter nTrunc is
1dd70 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
1dd80 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69  the pager file i
1dd90 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a  s truncated to.*
1dda0 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28  * nTrunc pages (
1ddb0 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  this is used by 
1ddc0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1ddd0 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73  bases)..*/.int s
1dde0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
1ddf0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1de00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
1de10 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63  ter, Pgno nTrunc
1de20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1de30 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52 41 43  LITE_OK;..  TRAC
1de40 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E4("DATABASE SYN
1de50 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
1de60 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c  er=%s nTrunc=%d\
1de70 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
1de80 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
1de90 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  aster, nTrunc);.
1dea0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1deb0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62   an in-memory db
1dec0 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61  , or no pages ha
1ded0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1dee0 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a  to, or this.  **
1def0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c   function has al
1df00 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
1df10 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
1df20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1df30 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1df40 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d  R_SYNCED && !MEM
1df50 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69  DB && pPager->di
1df60 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20  rtyCache ){.    
1df70 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
1df80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1df90 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a  journalOpen );..
1dfa0 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74      /* If a mast
1dfb0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1dfc0 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79  name has already
1dfd0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1dfe0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
1dff0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  nal file, then n
1e000 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  o sync is requir
1e010 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ed. This happens
1e020 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20   when it is.    
1e030 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e  ** written, then
1e040 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69   the process fai
1e050 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ls to upgrade fr
1e060 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f  om a RESERVED to
1e070 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
1e080 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e  SIVE lock. The n
1e090 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f  ext time the pro
1e0a0 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f  cess tries to co
1e0b0 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  mmit the.    ** 
1e0c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20  transaction the 
1e0d0 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61  m-j name will ha
1e0e0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1e0f0 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
1e100 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1e110 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20  >setMaster ){.  
1e120 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
1e130 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1e140 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
1e150 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e160 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1e170 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  xit;.#ifndef SQL
1e180 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1e190 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54  UUM.      if( nT
1e1a0 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
1e1b0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72     /* If this tr
1e1c0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61  ansaction has ma
1e1d0 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  de the database 
1e1e0 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c  smaller, then al
1e1f0 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20 20  l pages.        
1e200 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
1e210 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
1e220 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
1e230 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
1e240 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1e250 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
1e260 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a          Pgno i;.
1e270 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 50          void *pP
1e280 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  age;.        int
1e290 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d   iSkip = PAGER_M
1e2a0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a  J_PGNO(pPager);.
1e2b0 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e          for( i=n
1e2c0 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67  Trunc+1; i<=pPag
1e2d0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20  er->origDbSize; 
1e2e0 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
1e2f0 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61   if( !(pPager->a
1e300 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26  InJournal[i/8] &
1e310 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20   (1<<(i&7))) && 
1e320 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
1e330 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e340 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
1e350 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
1e360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1e370 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e380 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1e390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1e3a0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1e3b0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
1e3c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e3d0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
1e3e0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1e3f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e400 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1e410 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
1e420 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
1e430 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1e440 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
1e450 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
1e460 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
1e470 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e480 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1e490 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
1e4a0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1e4b0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1e4c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1e4d0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1e4e0 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
1e4f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1e500 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72  CUUM.    if( nTr
1e510 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
1e520 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1e530 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
1e540 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  r, nTrunc);.    
1e550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e560 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1e570 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  exit;.    }.#end
1e580 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  if..    /* Write
1e590 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1e5a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1e5b0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
1e5c0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
1e5d0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
1e5e0 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ger);.    rc = p
1e5f0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1e600 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ist(pPg);.    if
1e610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e620 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1e630 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
1e640 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e650 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
1e660 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
1e670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e680 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1e690 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  >fd, 0);.    }..
1e6a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1e6b0 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
1e6c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45  ;.  }else if( ME
1e6d0 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30  MDB && nTrunc!=0
1e6e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1e6f0 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
1e700 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
1e710 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
1e720 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
1e730 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1e740 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1e750 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
1e760 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
1e770 64 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f  d by pData to lo
1e780 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
1e790 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  he file. .**.** 
1e7a0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
1e7b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1e7c0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1e7d0 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74  pgno. If current
1e7e0 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73   page.** pgno is
1e7f0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
1e800 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1e810 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
1e820 77 72 69 74 74 65 6e 20 74 68 65 72 65 20 62 79  written there by
1e830 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74  .** by this rout
1e840 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70  ine. The same ap
1e850 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61 67  plies to the pag
1e860 65 20 70 44 61 74 61 20 72 65 66 65 72 73 20 74  e pData refers t
1e870 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  o on entry to.**
1e880 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1e890 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
1e8a0 74 6f 20 74 68 65 20 70 61 67 65 20 72 65 66 65  to the page refe
1e8b0 72 65 64 20 74 6f 20 62 79 20 70 44 61 74 61 20  red to by pData 
1e8c0 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
1e8d0 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
1e8e0 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
1e8f0 65 64 20 77 69 74 68 20 70 61 67 65 20 70 44 61  ed with page pDa
1e900 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  ta (i.e. data st
1e910 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
1e920 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
1e930 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
1e940 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
1e950 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1e960 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
1e970 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
1e980 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
1e990 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
1e9a0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1e9b0 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
1e9c0 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
1e9d0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1e9e0 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
1e9f0 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
1ea00 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
1ea10 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
1ea20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
1ea30 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
1ea40 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
1ea50 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
1ea60 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
1ea70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1ea80 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65  er_movepage(Page
1ea90 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
1eaa0 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e  *pData, Pgno pgn
1eab0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1eac0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1ead0 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72  (pData);.  PgHdr
1eae0 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74   *pPgOld; .  int
1eaf0 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   h;.  Pgno needS
1eb00 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20  yncPgno = 0;..  
1eb10 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1eb20 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 35  f>0 );..  TRACE5
1eb30 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
1eb40 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
1eb50 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
1eb60 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
1eb70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1eb80 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
1eb90 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  , pgno);..  if( 
1eba0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
1ebb0 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
1ebc0 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
1ebd0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1ebe0 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  inJournal );.   
1ebf0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
1ec00 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rty );.    asser
1ec10 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1ec20 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
1ec30 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
1ec40 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e   it's hash-chain
1ec50 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
1ec60 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
1ec70 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
1ec80 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
1ec90 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
1eca0 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
1ecb0 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
1ecc0 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
1ecd0 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
1ece0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
1ecf0 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
1ed00 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
1ed10 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
1ed20 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
1ed30 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
1ed40 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
1ed50 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
1ed60 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20    */.  pPgOld = 
1ed70 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1ed80 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
1ed90 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
1eda0 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
1edb0 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75  nRef==0 );.    u
1edc0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
1edd0 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a  Pager, pPgOld);.
1ede0 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
1edf0 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70  gOld);.    if( p
1ee00 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20  PgOld->needSync 
1ee10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1ee20 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e   pPgOld->inJourn
1ee30 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  al );.      pPg-
1ee40 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1ee50 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1ee60 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  ync = 1;.      a
1ee70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1ee80 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d  eedSync );.    }
1ee90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  .  }..  /* Chang
1eea0 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
1eeb0 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e  r for pPg and in
1eec0 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
1eed0 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e   new hash-chain.
1eee0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67   */.  assert( pg
1eef0 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e  no!=0 );.  pPg->
1ef00 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68  pgno = pgno;.  h
1ef10 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65   = pgno & (pPage
1ef20 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69  r->nHash-1);.  i
1ef30 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
1ef40 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [h] ){.    asser
1ef50 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
1ef60 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  [h]->pPrevHash==
1ef70 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1ef80 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
1ef90 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Hash = pPg;.  }.
1efa0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
1efb0 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
1efc0 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  [h];.  pPager->a
1efd0 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
1efe0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
1eff0 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74  = 0;..  makeDirt
1f000 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
1f010 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
1f020 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
1f030 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
1f040 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
1f050 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
1f060 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1f070 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
1f080 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
1f090 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
1f0a0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
1f0b0 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
1f0c0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
1f0d0 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
1f0e0 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
1f0f0 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
1f100 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
1f110 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e      ** Pager.aIn
1f120 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20  Journal bit has 
1f130 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e  been set. This n
1f140 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64  eeds to be remed
1f150 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20  ied by loading. 
1f160 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69     ** the page i
1f170 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61  nto the pager-ca
1f180 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20  che and setting 
1f190 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
1f1a0 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  nc flag..    **.
1f1b0 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
1f1c0 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 63 61  e3pager_get() ca
1f1d0 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
1f1e0 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
1f1f0 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
1f200 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
1f210 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
1f220 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
1f230 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1f240 20 76 6f 69 64 20 2a 70 4e 65 65 64 53 79 6e 63   void *pNeedSync
1f250 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1f260 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
1f270 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1f280 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
1f290 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
1f2a0 2c 20 26 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20  , &pNeedSync);. 
1f2b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f2c0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1f2d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  ;.    pPager->ne
1f2e0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1f2f0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e  DATA_TO_PGHDR(pN
1f300 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65 64 53 79  eedSync)->needSy
1f310 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41  nc = 1;.    DATA
1f320 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53  _TO_PGHDR(pNeedS
1f330 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  ync)->inJournal 
1f340 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72  = 1;.    makeDir
1f350 74 79 28 44 41 54 41 5f 54 4f 5f 50 47 48 44 52  ty(DATA_TO_PGHDR
1f360 28 70 4e 65 65 64 53 79 6e 63 29 29 3b 0a 20 20  (pNeedSync));.  
1f370 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
1f380 6e 72 65 66 28 70 4e 65 65 64 53 79 6e 63 29 3b  nref(pNeedSync);
1f390 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
1f3a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
1f3b0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
1f3c0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
1f3d0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f3e0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
1f3f0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  rn the current s
1f400 74 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65  tate of the file
1f410 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69   lock for the gi
1f420 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68  ven pager..** Th
1f430 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1f440 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b  s one of NO_LOCK
1f450 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
1f460 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a  ESERVED_LOCK,.**
1f470 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f   PENDING_LOCK, o
1f480 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
1f490 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f4a0 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28  pager_lockstate(
1f4b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f4c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1f4d0 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67  OsLockState(pPag
1f4e0 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69  er->fd);.}.#endi
1f4f0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
1f500 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
1f510 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  nt a listing of 
1f520 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70  all referenced p
1f530 61 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72  ages and their r
1f540 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  ef count..*/.voi
1f550 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  d sqlite3pager_r
1f560 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50  efdump(Pager *pP
1f570 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
1f580 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  pPg;.  for(pPg=p
1f590 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
1f5a0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
1f5b0 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50  All){.    if( pP
1f5c0 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e  g->nRef<=0 ) con
1f5d0 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  tinue;.    sqlit
1f5e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50  e3DebugPrintf("P
1f5f0 41 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20  AGE %3d addr=%p 
1f600 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  nRef=%d\n", .   
1f610 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50      pPg->pgno, P
1f620 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1f630 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20  ), pPg->nRef);. 
1f640 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e   }.}.#endif..#en
1f650 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1f660 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a           IT_DISKIO */.