/ Hex Artifact Content
Login

Artifact c438aa5fc248e0523e80591eeae33a3993c47278:


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 35  : pager.c,v 1.25
0350: 38 20 32 30 30 36 2f 30 32 2f 31 31 20 30 31 3a  8 2006/02/11 01:
0360: 32 35 3a 35 31 20 64 72 68 20 45 78 70 20 24 0a  25:51 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 46 49 4c 45 48 41 4e  GERID(p) FILEHAN
06e0: 44 4c 45 49 44 28 26 28 70 29 2d 3e 66 64 29 0a  DLEID(&(p)->fd).
06f0: 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44  #define FILEHAND
0700: 4c 45 49 44 28 66 64 29 20 28 73 71 6c 69 74 65  LEID(fd) (sqlite
0710: 33 4f 73 46 69 6c 65 48 61 6e 64 6c 65 28 26 66  3OsFileHandle(&f
0720: 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  d))../*.** The p
0730: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0740: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0750: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0760: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0770: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
0780: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
0790: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07a0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07b0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07d0: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
07e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
07f0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0820: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0830: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0860: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
0870: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0880: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0890: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08a0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08b0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
08c0: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
08d0: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
08e0: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0900: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0910: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0920: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0950: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0960: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0970: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
0980: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
0990: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09a0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
09d0: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
09e0: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
09f0: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a10: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a20: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a30: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a40: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a50: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0a60: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0a70: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0a80: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0aa0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0ab0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0ac0: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0af0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b00: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b10: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b20: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b30: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b50: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0b60: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0b70: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0ba0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bb0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0bc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0bd0: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0be0: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0bf0: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c00: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c10: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c20: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c30: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0c60: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0c70: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0c80: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ca0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cb0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0cc0: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0cf0: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d00: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74 68   is to remove th
0d10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0d20: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
0d30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
0d50: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
0d70: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0d80: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0d90: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0da0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0db0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0dc0: 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 6f  te3pager_get() o
0dd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0de0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0df0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0e00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0e10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0e20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0e30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0e40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0e50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0e60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0e70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0e80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 70 61 67   that sqlite3pag
0e90: 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61  er_write() is ca
0ea0: 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20  lled, the state 
0eb0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a  transitions to.*
0ec0: 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
0ed0: 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71  .  (Note that sq
0ee0: 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28  lite_page_write(
0ef0: 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a  ) can only be.**
0f00: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75   called on an ou
0f10: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77  tstanding page w
0f20: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
0f30: 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a  the pager must.*
0f40: 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48  * be in PAGER_SH
0f50: 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74  ARED before it t
0f60: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41  ransitions to PA
0f70: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a  GER_RESERVED.).*
0f80: 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  * The transition
0f90: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
0fa0: 49 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20  IVE occurs when 
0fb0: 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
0fc0: 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74  es.** are made t
0fd0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
0fe0: 69 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73  ile.  After an s
0ff0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
1000: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
1010: 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite_pager_commit
1020: 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f  (), the state go
1030: 65 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  es back to PAGER
1040: 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66  _SHARED..*/.#def
1050: 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  ine PAGER_UNLOCK
1060: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
1070: 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20  PAGER_SHARED    
1080: 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    1   /* same as
1090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a   SHARED_LOCK */.
10a0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45  #define PAGER_RE
10b0: 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a  SERVED    2   /*
10c0: 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56 45   same as RESERVE
10d0: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
10e0: 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  e PAGER_EXCLUSIV
10f0: 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20  E   4   /* same 
1100: 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  as EXCLUSIVE_LOC
1110: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1120: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35  ER_SYNCED      5
1130: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ../*.** If the S
1140: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52  QLITE_BUSY_RESER
1150: 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69  VED_LOCK macro i
1160: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61 74  s set to true at
1170: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a   compile-time,.*
1180: 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74  * then failed at
1190: 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20  tempts to get a 
11a0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69  reserved lock wi
11b0: 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ll invoke the bu
11c0: 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  sy callback..** 
11d0: 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20 64  This is off by d
11e0: 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20  efault.  To see 
11f0: 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  why, consider th
1200: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e  e following scen
1210: 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70  ario:.** .** Sup
1220: 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61 6c  pose thread A al
1230: 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61 72  ready has a shar
1240: 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74  ed lock and want
1250: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
1260: 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61  k..** Thread B a
1270: 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 73  lready has a res
1280: 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77  erved lock and w
1290: 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76  ants an exclusiv
12a0: 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62  e lock.  If.** b
12b0: 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65 20  oth threads are 
12c0: 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73 79  using their busy
12d0: 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d   callbacks, it m
12e0: 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74  ight be a long t
12f0: 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e  ime.** be for on
1300: 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64 73  e of the threads
1310: 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c   give up and all
1320: 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f  ows the other to
1330: 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74   proceed..** But
1340: 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20 74   if the thread t
1350: 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65  rying to get the
1360: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67   reserved lock g
1370: 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a  ives up quickly.
1380: 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72 20  ** (if it never 
1390: 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79  invokes its busy
13a0: 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20   callback) then 
13b0: 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77  the contention w
13c0: 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76  ill be.** resolv
13d0: 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23  ed quickly..*/.#
13e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55  ifndef SQLITE_BU
13f0: 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
1400: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1410: 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
1420: 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OCK 0.#endif../*
1430: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72  .** This macro r
1440: 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20  ounds values up 
1450: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 76  so that if the v
1460: 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72 65  alue is an addre
1470: 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72  ss it.** is guar
1480: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20  anteed to be an 
1490: 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73 20  address that is 
14a0: 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d  aligned to an 8-
14b0: 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a  byte boundary..*
14c0: 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f  /.#define FORCE_
14d0: 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28  ALIGNMENT(X)   (
14e0: 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a  ((X)+7)&~7)../*.
14f0: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
1500: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
1510: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
1520: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
1530: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
1540: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
1550: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
1560: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
1570: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
1580: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
1590: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
15a0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
15b0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
15c0: 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75  Client code shou
15d0: 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 70  ld call sqlite3p
15e0: 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20  ager_write() on 
15f0: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1600: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1610: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1620: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1630: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1640: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a  3pager_write().*
1650: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  * is called, the
1660: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
1670: 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74  ontents are writ
1680: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c  ten into the rol
1690: 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  lback.** journal
16a0: 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75   and PgHdr.inJou
16b0: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e  rnal and PgHdr.n
16c0: 65 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e  eedSync are set.
16d0: 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a    Later, once.**
16e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67   the journal pag
16f0: 65 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e  e has made it on
1700: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
1710: 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53  ace, PgHdr.needS
1720: 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  ync.** is cleare
1730: 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64  d.  The modified
1740: 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20   page cannot be 
1750: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
1760: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a  o the original.*
1770: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1780: 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61  until the journa
1790: 6c 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e  l pages has been
17a0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
17b0: 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72  and the.** PgHdr
17c0: 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65  .needSync has be
17d0: 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  en cleared..**.*
17e0: 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74  * The PgHdr.dirt
17f0: 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68  y flag is set wh
1800: 65 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  en sqlite3pager_
1810: 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  write() is calle
1820: 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61  d and.** is clea
1830: 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74  red again when t
1840: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1850: 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
1860: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  to the original.
1870: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1880: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1890: 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72 3b  uct PgHdr PgHdr;
18a0: 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a  .struct PgHdr {.
18b0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
18e0: 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65   which this page
18f0: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67   belongs */.  Pg
1900: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1920: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1930: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
1940: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48  .  PgHdr *pNextH
1950: 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b  ash, *pPrevHash;
1960: 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73    /* Hash collis
1970: 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67  ion chain for Pg
1980: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67  Hdr.pgno */.  Pg
1990: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
19a0: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
19b0: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
19c0: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
19d0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
19e0: 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tAll;           
19f0: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
1a00: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
1a10: 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74  PgHdr *pNextStmt
1a20: 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f  , *pPrevStmt;  /
1a30: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
1a40: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
1a50: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
1a60: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a80: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1a90: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1aa0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74  nal */.  u8 inSt
1ab0: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
1ac0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1ad0: 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  if in the statem
1ae0: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
1af0: 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20 20  /.  u8 dirty;   
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65     /* TRUE if we
1b20: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 62   need to write b
1b30: 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ack changes */. 
1b40: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20  /* Sync journal 
1b70: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
1b80: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
1b90: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b   alwaysRollback;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
1bc0: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73  lback() for this
1bd0: 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74   page */.  short
1be0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c00: 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20  ber of users of 
1c10: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
1c20: 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20  gHdr *pDirty;   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72   Dirty pages sor
1c50: 74 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e  ted by PgHdr.pgn
1c60: 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  o */.#ifdef SQLI
1c70: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1c80: 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23   u32 pageHash;.#
1c90: 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65  endif.  /* pPage
1ca0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1cb0: 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66  s of page data f
1cc0: 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65  ollow this heade
1cd0: 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e  r */.  /* Pager.
1ce0: 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
1cf0: 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f  local data follo
1d00: 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  w the page data 
1d10: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
1d20: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
1d30: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
1d40: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
1d50: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
1d60: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
1d70: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
1d80: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
1d90: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
1da0: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
1db0: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
1dc0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
1dd0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1de0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
1df0: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
1e00: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
1e10: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
1e20: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1e30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
1e40: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
1e50: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
1e60: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
1e70: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
1e80: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
1e90: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
1ea0: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
1eb0: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
1ec0: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
1ed0: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
1ee0: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
1ef0: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
1f00: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
1f10: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
1f20: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
1f30: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
1f40: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
1f50: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
1f60: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
1f70: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
1f80: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
1f90: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
1fa0: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
1fb0: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
1fc0: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
1fd0: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
1fe0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
1ff0: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
2000: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
2010: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
2020: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
2030: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
2040: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
2050: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
2060: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
2070: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
2080: 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c  efine CODEC(P,D,
2090: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
20a0: 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  ec ){ P->xCodec(
20b0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
20c0: 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64  ,X); }.#else.# d
20d0: 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c  efine CODEC(P,D,
20e0: 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  N,X).#endif../*.
20f0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
2100: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
2110: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2120: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
2130: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
2140: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2150: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2160: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2170: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2180: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
2190: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
21a0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
21b0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
21c0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
21d0: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
21e0: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
21f0: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
2200: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
2210: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
2220: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
2230: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
2240: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2250: 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67  )../*.** How big
2260: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
2270: 68 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72  h table used for
2280: 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d   locating in-mem
2290: 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20 62 79 20  ory pages.** by 
22a0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
22b0: 73 20 6d 61 63 72 6f 20 6c 6f 6f 6b 73 20 61 20  s macro looks a 
22c0: 6c 69 74 74 6c 65 20 73 69 6c 6c 79 2c 20 62 75  little silly, bu
22d0: 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 0a 2a  t is evaluated.*
22e0: 2a 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  * at compile-tim
22f0: 65 2c 20 6e 6f 74 20 72 75 6e 2d 74 69 6d 65 20  e, not run-time 
2300: 28 61 74 20 6c 65 61 73 74 20 66 6f 72 20 67 63  (at least for gc
2310: 63 20 74 68 69 73 20 69 73 20 74 72 75 65 29 2e  c this is true).
2320: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47  .*/.#define N_PG
2330: 5f 48 41 53 48 20 28 5c 0a 20 20 28 4d 41 58 5f  _HASH (\.  (MAX_
2340: 50 41 47 45 53 3e 31 30 32 34 29 3f 32 30 34 38  PAGES>1024)?2048
2350: 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53  : \.  (MAX_PAGES
2360: 3e 35 31 32 29 3f 31 30 32 34 3a 20 5c 0a 20 20  >512)?1024: \.  
2370: 28 4d 41 58 5f 50 41 47 45 53 3e 32 35 36 29 3f  (MAX_PAGES>256)?
2380: 35 31 32 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41  512: \.  (MAX_PA
2390: 47 45 53 3e 31 32 38 29 3f 32 35 36 3a 20 5c 0a  GES>128)?256: \.
23a0: 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 36 34 29    (MAX_PAGES>64)
23b0: 3f 31 32 38 3a 36 34 20 5c 0a 29 0a 0a 2f 2a 0a  ?128:64 \.)../*.
23c0: 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e  ** Hash a page n
23d0: 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  umber.*/.#define
23e0: 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20   pager_hash(PN) 
23f0: 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53   ((PN)&(N_PG_HAS
2400: 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f  H-1))../*.** A o
2410: 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69  pen page cache i
2420: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
2430: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2440: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
2450: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61  Pager.errCode ma
2460: 79 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  y be set to SQLI
2470: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
2480: 5f 43 4f 52 52 55 50 54 2c 20 53 51 4c 49 54 45  _CORRUPT, SQLITE
2490: 5f 50 52 4f 54 4f 43 4f 4c 0a 2a 2a 20 6f 72 20  _PROTOCOL.** or 
24a0: 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63  SQLITE_FULL. Onc
24b0: 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72  e one of the fir
24c0: 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20  st three errors 
24d0: 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69  occurs, it persi
24e0: 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65  sts.** and is re
24f0: 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65  turned as the re
2500: 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61  sult of every ma
2510: 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61  jor pager API ca
2520: 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49  ll.  The.** SQLI
2530: 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63  TE_FULL return c
2540: 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ode is slightly 
2550: 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65  different. It pe
2560: 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69  rsists only unti
2570: 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75  l the.** next su
2580: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
2590: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
25a0: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
25b0: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49  e. Also,.** SQLI
25c0: 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74  TE_FULL does not
25d0: 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69   affect the sqli
25e0: 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 61  te3pager_get() a
25f0: 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nd sqlite3pager_
2600: 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73  lookup().** APIs
2610: 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c  , they may still
2620: 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73   be used success
2630: 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74  fully..*/.struct
2640: 20 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f   Pager {.  u8 jo
2650: 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20  urnalOpen;      
2660: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2670: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  f journal file d
2680: 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61  escriptors is va
2690: 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  lid */.  u8 jour
26a0: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
26b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
26c0: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
26d0: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
26e0: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2700: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
2710: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
2720: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
2730: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
2740: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
2750: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
2760: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
2770: 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20  8 stmtOpen;     
2780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2790: 75 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  ue if the statem
27a0: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69  ent subjournal i
27b0: 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73  s open */.  u8 s
27c0: 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20  tmtInUse;       
27d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27e0: 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74  we are in a stat
27f0: 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
2800: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d  tion */.  u8 stm
2810: 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20  tAutoopen;      
2820: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74        /* Open st
2830: 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20  mt journal when 
2840: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20  main journal is 
2850: 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f  opened*/.  u8 no
2860: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2870: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
2880: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
2890: 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75  l if true */.  u
28a0: 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20  8 fullSync;     
28b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
28c0: 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20   extra syncs of 
28d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
28e0: 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20  robustness */.  
28f0: 75 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20  u8 full_fsync;  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2910: 73 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77  se F_FULLFSYNC w
2920: 68 65 6e 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  hen available */
2930: 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20  .  u8 state;    
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2950: 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20  * PAGER_UNLOCK, 
2960: 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56  _SHARED, _RESERV
2970: 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38  ED, etc. */.  u8
2980: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
2990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
29a0: 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64   of several kind
29b0: 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  s of errors */. 
29c0: 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20   u8 tempFile;   
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74  zFilename is a t
29f0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f  emporary file */
2a00: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a20: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
2a30: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
2a40: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
2a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a60: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
2a70: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
2a80: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
2a90: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63  */.  u8 dirtyCac
2aa0: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  he;             
2ab0: 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
2ac0: 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68  ed pages have ch
2ad0: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c  anged */.  u8 al
2ae0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
2af0: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
2b00: 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
2b10: 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  ) for all pages 
2b20: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
2b50: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
2b60: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
2b70: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2b80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
2b90: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
2ba0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
2bb0: 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65   */.  int dbSize
2bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bd0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2be0: 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
2bf0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62   */.  int origDb
2c00: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2c10: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
2c20: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
2c30: 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73  hange */.  int s
2c40: 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  tmtSize;        
2c50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2c60: 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70  f database (in p
2c70: 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65  ages) at stmt_be
2c80: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  gin() */.  int n
2c90: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
2ca0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2cb0: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
2cc0: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2cd0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
2ce0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
2cf0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
2d00: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
2d10: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
2d20: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65  */.  int stmtNRe
2d30: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2d40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2d50: 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75  cords in stmt su
2d60: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  bjournal */.  in
2d70: 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  t nExtra;       
2d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2d90: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
2da0: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2db0: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2dc0: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
2dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2de0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
2df0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
2e00: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2e10: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
2e20: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
2e30: 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  ory pages */.  i
2e40: 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20 20 20  nt nMaxPage;    
2e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69             /* Hi
2e60: 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20 6f 66  gh water mark of
2e70: 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   nPage */.  int 
2e80: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
2e90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ea0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
2eb0: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
2ec0: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
2ed0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
2ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2ef0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
2f00: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
2f10: 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  che */.  u8 *aIn
2f20: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2f30: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2f40: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2f50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f60: 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53  le */.  u8 *aInS
2f70: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
2f80: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
2f90: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
2fa0: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
2fb0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
2fc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2fd0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2fe0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2ff0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
3000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3010: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
3020: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
3030: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
3040: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
3050: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
3060: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
3070: 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c  files */.  OsFil
3080: 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20  e *fd, *jfd;    
3090: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
30a0: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
30b0: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
30c0: 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20  nal */.  OsFile 
30d0: 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20 20  *stfd;          
30e0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
30f0: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
3100: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
3110: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
3120: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
3130: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
3140: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
3150: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64 72  ndler */.  PgHdr
3160: 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74   *pFirst, *pLast
3170: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
3180: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
3190: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
31a0: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  ynced;        /*
31b0: 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65   First free page
31c0: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64   with PgHdr.need
31d0: 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  Sync==0 */.  PgH
31e0: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
31f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
3200: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
3210: 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b  .  PgHdr *pStmt;
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3230: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
3240: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
3250: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
3260: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3280: 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66  Current byte off
3290: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
32a0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
32b0: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
32c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
32d0: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
32e0: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
32f0: 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  er */.  i64 stmt
3300: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
3310: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75      /* First jou
3320: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
3330: 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  ten this stateme
3340: 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  nt */.  i64 stmt
3350: 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  Cksum;          
3360: 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74      /* cksumInit
3370: 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20   when statement 
3380: 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  was started */. 
3390: 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20   i64 stmtJSize; 
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33b0: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
33c0: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
33d0: 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  */.  int sectorS
33e0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
33f0: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
3400: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
3410: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65  ollback */.#ifde
3420: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
3430: 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c  int nHit, nMiss,
3440: 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43   nOvfl;     /* C
3450: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69  ache hits, missi
3460: 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72  ng, and LRU over
3470: 66 6c 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  flows */.  int n
3480: 52 65 61 64 2c 6e 57 72 69 74 65 3b 20 20 20 20  Read,nWrite;    
3490: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
34a0: 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72  se pages read/wr
34b0: 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a  itten */.#endif.
34c0: 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75    void (*xDestru
34d0: 63 74 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29  ctor)(void*,int)
34e0: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
34f0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65  outine when free
3500: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76  ing pages */.  v
3510: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
3520: 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f  (void*,int);   /
3530: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
3540: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
3550: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
3560: 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
3570: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
3580: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
3590: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
35a0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
35b0: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
35c0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
35d0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
35e0: 28 29 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61  () */.  PgHdr *a
35f0: 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b  Hash[N_PG_HASH];
3600: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
3610: 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75  e to map page nu
3620: 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f  mber to PgHdr */
3630: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3640: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
3650: 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20  AGEMENT.  Pager 
3660: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
3670: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20        /* Linked 
3680: 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 69  list of pagers i
3690: 6e 20 74 68 69 73 20 74 68 72 65 61 64 20 2a 2f  n this thread */
36a0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
36b0: 2a 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54  * If SQLITE_TEST
36c0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
36d0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   increment the v
36e0: 61 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e  ariable given in
36f0: 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74  .** the argument
3700: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3710: 45 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20  E_TEST.# define 
3720: 54 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b  TEST_INCR(x)  x+
3730: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
3740: 20 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65   TEST_INCR(x).#e
3750: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  ndif../*.** Jour
3760: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
3770: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
3780: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
3790: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
37a0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
37b0: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
37c0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
37d0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
37e0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
37f0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
3800: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
3810: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
3820: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
3830: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3840: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
3850: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
3860: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69   journal is begi
3870: 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  n.** written, se
3880: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
3890: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
38a0: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
38b0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
38c0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
38d0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
38e0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
38f0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
3900: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
3910: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
3920: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
3930: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
3940: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
3950: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
3960: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
3970: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
3980: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
3990: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
39a0: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
39b0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
39c0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
39d0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
39e0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
39f0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
3a00: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
3a10: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
3a20: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
3a30: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
3a40: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
3a50: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
3a60: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
3a70: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
3a80: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
3a90: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
3aa0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
3ab0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
3ac0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
3ad0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
3ae0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
3af0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
3b00: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
3b10: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
3b20: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
3b30: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
3b40: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
3b50: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
3b60: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
3b70: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
3b80: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
3b90: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
3ba0: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
3bb0: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
3bc0: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
3bd0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
3be0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
3bf0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
3c00: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
3c10: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
3c20: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
3c30: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
3c40: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
3c50: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
3c60: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
3c70: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
3c80: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
3c90: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
3ca0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
3cb0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
3cc0: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
3cd0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
3ce0: 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  f the header and
3cf0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e   of each page in
3d00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3d10: 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79  determined.** by
3d20: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3d30: 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  acros..*/.#defin
3d40: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
3d50: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
3d60: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
3d70: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
3d80: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
3d90: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
3da0: 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   In the future, 
3db0: 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  this could be.**
3dc0: 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
3dd0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
3de0: 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72   disk controller
3df0: 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a  . The important.
3e00: 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
3e10: 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20  c is that it is 
3e20: 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73  the same size as
3e30: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a   a disk sector..
3e40: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
3e50: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
3e60: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
3e70: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
3e80: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
3e90: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
3ea0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
3eb0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
3ec0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
3ed0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
3ee0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
3ef0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
3f00: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
3f10: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
3f20: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
3f30: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
3f40: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
3f50: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
3f60: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
3f70: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
3f80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
3f90: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
3fa0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
3fb0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
3fc0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
3fd0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3fe0: 65 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  e default size o
3ff0: 66 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a  f a disk sector.
4000: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
4010: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32  _SECTOR_SIZE 512
4020: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d  ../*.** Page num
4030: 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ber PAGER_MJ_PGN
4040: 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  O is never used 
4050: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
4060: 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20  abase (it is.** 
4070: 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72  reserved for wor
4080: 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69  king around a wi
4090: 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f  ndows/posix inco
40a0: 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74  mpatibility). It
40b0: 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74   is.** used in t
40c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69  he journal to si
40d0: 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72  gnify that the r
40e0: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
40f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
4100: 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73   is devoted to s
4110: 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20  toring a master 
4120: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74  journal name - t
4130: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
4140: 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c   pages to.** rol
4150: 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d  l back. See comm
4160: 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f  ents for functio
4170: 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  n writeMasterJou
4180: 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69  rnal() for detai
4190: 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e  ls..*/./* #defin
41a0: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
41b0: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
41c0: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
41d0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ) */.#define PAG
41e0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28  ER_MJ_PGNO(x) ((
41f0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
4200: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29  )->pageSize))+1)
4210: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
4220: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
4230: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
4240: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
4250: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
4260: 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a  147483647../*.**
4270: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
4280: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
4290: 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29   (for debugging)
42a0: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
42b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
42c0: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
42d0: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
42e0: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
42f0: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
4300: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
4310: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
4320: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
4330: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
4340: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
4350: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
4360: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
4370: 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  4d addr=%p nRef=
4380: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
4390: 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
43a0: 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66  DATA(p), p->nRef
43b0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b  .    );.    cnt+
43c0: 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e  +;   /* Somethin
43d0: 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  g to set a break
43e0: 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a  point on */.  }.
43f0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
4400: 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e  (X)  pager_refin
4410: 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  fo(X).#else.# de
4420: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a  fine REFINFO(X).
4430: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
4440: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
4450: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76  ger from the giv
4460: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
4470: 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69  or.  Store the i
4480: 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69  nteger.** that i
4490: 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e  s read in *pRes.
44a0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
44b0: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
44c0: 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a   worked, or an.*
44d0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
44e0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
44f0: 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rong..**.** All 
4500: 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65  values are store
4510: 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67  d on disk as big
4520: 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74  -endian..*/.stat
4530: 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74  ic int read32bit
4540: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
4550: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
4560: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
4570: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
4580: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
4590: 2c 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20  , sizeof(ac));. 
45a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
45b0: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  OK ){.    *pRes 
45c0: 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20  = (ac[0]<<24) | 
45d0: 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61  (ac[1]<<16) | (a
45e0: 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d  c[2]<<8) | ac[3]
45f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4600: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
4610: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
4620: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
4630: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
4640: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
4650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4660: 20 70 75 74 33 32 62 69 74 73 28 63 68 61 72 20   put32bits(char 
4670: 2a 61 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  *ac, u32 val){. 
4680: 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32   ac[0] = (val>>2
4690: 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  4) & 0xff;.  ac[
46a0: 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26  1] = (val>>16) &
46b0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d   0xff;.  ac[2] =
46c0: 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66   (val>>8) & 0xff
46d0: 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20  ;.  ac[3] = val 
46e0: 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  & 0xff;.}../*.**
46f0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
4700: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
4710: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
4720: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
4730: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
4740: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
4750: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
4760: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
4770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4780: 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69  write32bits(OsFi
4790: 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29  le *fd, u32 val)
47a0: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
47b0: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
47c0: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
47d0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
47e0: 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a  , ac, 4);.}../*.
47f0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 33 32 2d  ** Write the 32-
4800: 62 69 74 20 69 6e 74 65 67 65 72 20 27 76 61 6c  bit integer 'val
4810: 27 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  ' into the page 
4820: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
4830: 67 65 20 68 65 61 64 65 72 0a 2a 2a 20 27 70 27  ge header.** 'p'
4840: 20 61 74 20 6f 66 66 73 65 74 20 27 6f 66 66 73   at offset 'offs
4850: 65 74 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  et'..*/.static v
4860: 6f 69 64 20 73 74 6f 72 65 33 32 62 69 74 73 28  oid store32bits(
4870: 75 33 32 20 76 61 6c 2c 20 50 67 48 64 72 20 2a  u32 val, PgHdr *
4880: 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a  p, int offset){.
4890: 20 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63    char *ac;.  ac
48a0: 20 3d 20 26 28 28 63 68 61 72 2a 29 50 47 48 44   = &((char*)PGHD
48b0: 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66  R_TO_DATA(p))[of
48c0: 66 73 65 74 5d 3b 0a 20 20 70 75 74 33 32 62 69  fset];.  put32bi
48d0: 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 7d 0a 0a  ts(ac, val);.}..
48e0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
48f0: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
4900: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
4910: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
4920: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
4930: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
4940: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
4950: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
4960: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4970: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4980: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4990: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
49a0: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
49b0: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
49c0: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
49d0: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
49e0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
49f0: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  [3];.}.../*.** T
4a00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
4a10: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
4a20: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
4a30: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
4a40: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
4a50: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4a60: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4a70: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
4a80: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
4a90: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
4aa0: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
4ab0: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
4ac0: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
4ad0: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
4ae0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
4af0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
4b00: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
4b10: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
4b20: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
4b30: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
4b40: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
4b50: 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54  CORRUPT or SQLIT
4b60: 45 5f 50 52 4f 54 4f 43 4f 4c 2c 0a 2a 2a 20 74  E_PROTOCOL,.** t
4b70: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
4b80: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c   persistent. All
4b90: 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20   subsequent API 
4ba0: 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61  calls on this Pa
4bb0: 67 65 72 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65  ger.** will imme
4bc0: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
4bd0: 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f  he same error co
4be0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
4bf0: 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
4c00: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
4c10: 20 72 63 29 7b 0a 20 20 61 73 73 65 72 74 28 20   rc){.  assert( 
4c20: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
4c30: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
4c40: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
4c50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
4c60: 69 66 28 20 0a 20 20 20 20 72 63 3d 3d 53 51 4c  if( .    rc==SQL
4c70: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
4c80: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
4c90: 20 7c 7c 0a 20 20 20 20 72 63 3d 3d 53 51 4c 49   ||.    rc==SQLI
4ca0: 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 0a 20 20  TE_CORRUPT ||.  
4cb0: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 50 52 4f    rc==SQLITE_PRO
4cc0: 54 4f 43 4f 4c 0a 20 20 29 7b 0a 20 20 20 20 70  TOCOL.  ){.    p
4cd0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
4ce0: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
4cf0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
4d00: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
4d10: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
4d20: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
4d30: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
4d40: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
4d50: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
4d60: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
4d70: 61 67 65 29 7b 0a 20 20 75 33 32 20 68 61 73 68  age){.  u32 hash
4d80: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
4d90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4da0: 70 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65  pData = (unsigne
4db0: 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54  d char *)PGHDR_T
4dc0: 4f 5f 44 41 54 41 28 70 50 61 67 65 29 3b 0a 20  O_DATA(pPage);. 
4dd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
4de0: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
4df0: 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  ize; i++){.    h
4e00: 61 73 68 20 3d 20 28 68 61 73 68 2b 69 29 5e 70  ash = (hash+i)^p
4e10: 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  Data[i];.  }.  r
4e20: 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f  eturn hash;.}../
4e30: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
4e40: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
4e50: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
4e60: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
4e70: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
4e80: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
4e90: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
4ea0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
4eb0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
4ec0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
4ed0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
4ee0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
4ef0: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
4f00: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
4f10: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
4f20: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
4f30: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
4f40: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
4f50: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
4f60: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
4f70: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
4f80: 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61  rt( !pPg->pageHa
4f90: 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  sh || pPager->er
4fa0: 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c  rCode || MEMDB |
4fb0: 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20  | pPg->dirty || 
4fc0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
4fd0: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
4fe0: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
4ff0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 43 48  #else.#define CH
5000: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
5010: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  if../*.** When t
5020: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
5030: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
5040: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
5050: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
5060: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
5070: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
5080: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65   read from the e
5090: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
50a0: 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  nd .** written i
50b0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
50c0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
50d0: 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74  alloc(). *pzMast
50e0: 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  er is.** set to 
50f0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d  point at the mem
5100: 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
5110: 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
5120: 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73  caller must.** s
5130: 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d  qliteFree() *pzM
5140: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
5150: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
5160: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
5170: 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72  resent *pzMaster
5180: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
5190: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
51a0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
51b0: 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72  c int readMaster
51c0: 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a  Journal(OsFile *
51d0: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a  pJrnl, char **pz
51e0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
51f0: 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20  c;.  u32 len;.  
5200: 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63  i64 szJ;.  u32 c
5210: 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ksum;.  int i;. 
5220: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
5230: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
5240: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
5250: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
5260: 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  /..  *pzMaster =
5270: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
5280: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
5290: 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  rnl, &szJ);.  if
52a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
52b0: 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75  || szJ<16 ) retu
52c0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
52d0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72  qlite3OsSeek(pJr
52e0: 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69  nl, szJ-16);.  i
52f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5300: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a   ) return rc;. .
5310: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
5320: 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a  s(pJrnl, &len);.
5330: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5340: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5350: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
5360: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75  its(pJrnl, &cksu
5370: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
5380: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5390: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
53a0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
53b0: 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20  , aMagic, 8);.  
53c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
53d0: 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67  K || memcmp(aMag
53e0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
53f0: 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72  c, 8) ) return r
5400: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5410: 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20  e3OsSeek(pJrnl, 
5420: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69  szJ-16-len);.  i
5430: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5440: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5450: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68   *pzMaster = (ch
5460: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
5470: 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20  c(len+1);.  if( 
5480: 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  !*pzMaster ){.  
5490: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
54a0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20  NOMEM;.  }.  rc 
54b0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
54c0: 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72  pJrnl, *pzMaster
54d0: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
54e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
54f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
5500: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
5510: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
5520: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5530: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
5540: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
5550: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
5560: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
5570: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
5580: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
5590: 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d  = (*pzMaster)[i]
55a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
55b0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
55c0: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
55d0: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
55e0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
55f0: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
5600: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
5610: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
5620: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
5630: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
5640: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
5650: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
5660: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
5670: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
5680: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
5690: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
56a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
56b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
56c0: 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72  teFree(*pzMaster
56d0: 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72  );.    *pzMaster
56e0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
56f0: 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c     (*pzMaster)[l
5700: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  en] = '\0';.  }.
5710: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
5720: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5730: 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61   Seek the journa
5740: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
5750: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  r to the next se
5760: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68  ctor boundary wh
5770: 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ere a.** journal
5780: 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72   header may be r
5790: 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
57a0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
57b0: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
57c0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b  .** the new seek
57d0: 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69   offset..**.** i
57e0: 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20  .e for a sector 
57f0: 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a  size of 512:.**.
5800: 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20  ** Input Offset 
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74               Out
5820: 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d  put Offset.** --
5830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5850: 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20  -----.** 0      
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20     0.** 512     
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20    512.** 100    
58a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58b0: 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20     512.** 2000  
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
58e0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a  static int seekJ
58f0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
5900: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
5910: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
5920: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
5930: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
5940: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
5950: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
5960: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
5970: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
5980: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
5990: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
59a0: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
59b0: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
59c0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
59d0: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
59e0: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
59f0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5a00: 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  er) );.  pPager-
5a10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66  >journalOff = of
5a20: 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73  fset;.  return s
5a30: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
5a40: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
5a50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d  ->journalOff);.}
5a60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
5a70: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
5a80: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
5a90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5aa0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
5ab0: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
5ac0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
5ad0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
5ae0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
5af0: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
5b00: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
5b10: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
5b20: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
5b30: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
5b40: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
5b50: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
5b60: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
5b70: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5b80: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
5b90: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
5ba0: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
5bb0: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
5bc0: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
5bd0: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
5be0: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
5bf0: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
5c00: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
5c10: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
5c20: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
5c30: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
5c40: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
5c50: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a   journal..** .**
5c60: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
5c70: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
5c80: 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  4) bytes of unus
5c90: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
5ca0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
5cb0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
5cc0: 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20 7a  Pager){.  char z
5cd0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
5ce0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
5cf0: 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 65  ;..  int rc = se
5d00: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
5d10: 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ger);.  if( rc )
5d20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
5d30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
5d40: 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
5d50: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 70 50  nalOff;.  if( pP
5d60: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
5d70: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
5d80: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
5d90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
5da0: 64 72 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  dr;.  }.  pPager
5db0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
5dc0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5dd0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49  Pager);..  /* FI
5de0: 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  X ME: .  **.  **
5df0: 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20   Possibly for a 
5e00: 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d  pager not in no-
5e10: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  sync mode, the j
5e20: 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f  ournal magic sho
5e30: 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20  uld not.  ** be 
5e40: 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52  written until nR
5e50: 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20  ec is filled in 
5e60: 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20  as part of next 
5e70: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a  syncJournal(). .
5e80: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
5e90: 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f  ly maybe the who
5ea0: 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  le journal heade
5eb0: 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61  r should be dela
5ec0: 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20  yed until that. 
5ed0: 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b   ** point. Think
5ee0: 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a   about this..  *
5ef0: 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64  /.  memcpy(zHead
5f00: 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
5f10: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
5f20: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a 20  alMagic));.  /* 
5f30: 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20  The nRec Field. 
5f40: 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e  0xFFFFFFFF for n
5f50: 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e  o-sync journals.
5f60: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
5f70: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
5f80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
5f90: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
5fa0: 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
5fb0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  );.  /* The rand
5fc0: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
5fd0: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
5fe0: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
5ff0: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
6000: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
6010: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6020: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
6030: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6040: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
6050: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
6060: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
6070: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
6080: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
6090: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
60a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
60b0: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
60c0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
60d0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
60e0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
60f0: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
6100: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6110: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6120: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
6130: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 72  sectorSize);.  r
6140: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6150: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6160: 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
6170: 7a 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a  zHeader));..  /*
6180: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
6190: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
61a0: 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  tten successfull
61b0: 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  y. Seek the jour
61c0: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65  nal.  ** file de
61d0: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
61e0: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
61f0: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
6200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
6210: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6220: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6230: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
6240: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
6250: 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28  lOff-1);.    if(
6260: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6270: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
6280: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
6290: 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c  er->jfd, "\000",
62a0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
62b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
62c0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
62d0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
62e0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
62f0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
6300: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
6310: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
6320: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
6330: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
6340: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
6350: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
6360: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
6370: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
6380: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
6390: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
63a0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
63b0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
63c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
63d0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
63e0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
63f0: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
6400: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
6410: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
6420: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
6430: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
6440: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
6450: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
6460: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
6470: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
6480: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
6490: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
64a0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
64b0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
64c0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
64d0: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
64e0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
64f0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
6500: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
6510: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
6520: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
6530: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
6540: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
6550: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
6560: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
6570: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
6580: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
6590: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
65a0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
65b0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
65c0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
65d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
65e0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
65f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
6600: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
6610: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
6620: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
6630: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
6640: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
6650: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
6660: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
6670: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
6680: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b   */..  rc = seek
6690: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
66a0: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
66b0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
66c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
66d0: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
66e0: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
66f0: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
6700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6710: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6720: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
6730: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
6740: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
6750: 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ));.  if( rc ) r
6760: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
6770: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
6780: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
6790: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
67a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
67b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
67c0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
67d0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
67e0: 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72   pNRec);.  if( r
67f0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
6800: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6810: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  s(pPager->jfd, &
6820: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6830: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
6840: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6850: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6860: 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a  ger->jfd, pDbSiz
6870: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
6880: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
6890: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
68a0: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
68b0: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
68c0: 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  e used by .  ** 
68d0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
68e0: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
68f0: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
6900: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20  ournal was.  ** 
6910: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
6920: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
6930: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
6940: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  his routine.  **
6950: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
6960: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
6970: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
6980: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
6990: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
69a0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
69b0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
69c0: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
69d0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
69e0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
69f0: 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67  fd, (u32 *)&pPag
6a00: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
6a10: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6a20: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
6a30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
6a40: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6a50: 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  Pager);.  rc = s
6a60: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
6a70: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
6a80: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
6a90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
6aa0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
6ab0: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
6ac0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
6ad0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
6ae0: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
6af0: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
6b00: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
6b10: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
6b20: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
6b30: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
6b40: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
6b50: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
6b60: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
6b70: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
6b80: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
6b90: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
6ba0: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
6bb0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
6bc0: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
6bd0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
6be0: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
6bf0: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62   is:.**.** + 4 b
6c00: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
6c10: 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65  GNO..** + N byte
6c20: 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  s: length of mas
6c30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6c40: 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  ..** + 4 bytes: 
6c50: 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  N.** + 4 bytes: 
6c60: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
6c70: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
6c80: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
6c90: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
6ca0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
6cb0: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
6cc0: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
6cd0: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
6ce0: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
6cf0: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  rnal name..**.**
6d00: 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
6d10: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
6d20: 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
6d30: 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
6d40: 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
6d50: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
6d60: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
6d70: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
6d80: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
6d90: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
6da0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
6db0: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
6dc0: 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20    int i; .  u32 
6dd0: 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61  cksum = 0;.  cha
6de0: 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a  r zBuf[sizeof(aJ
6df0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34  ournalMagic)+2*4
6e00: 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  ];..  if( !zMast
6e10: 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65  er || pPager->se
6e20: 74 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20  tMaster) return 
6e30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
6e40: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
6e50: 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72   1;..  len = str
6e60: 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  len(zMaster);.  
6e70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
6e80: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
6e90: 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20  += zMaster[i];. 
6ea0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
6eb0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
6ec0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
6ed0: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
6ee0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
6ef0: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
6f00: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
6f10: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
6f20: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
6f30: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
6f40: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
6f50: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
6f60: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
6f70: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
6f80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a  {.    rc = seekJ
6f90: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
6fa0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
6fb0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6fc0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
6fd0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
6fe0: 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72  = (len+20);..  r
6ff0: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
7000: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47  pPager->jfd, PAG
7010: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
7020: 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  r));.  if( rc!=S
7030: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
7040: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
7050: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
7060: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
7070: 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  r, len);.  if( r
7080: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
7090: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74  eturn rc;..  put
70a0: 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e  32bits(zBuf, len
70b0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
70c0: 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b  zBuf[4], cksum);
70d0: 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b  .  memcpy(&zBuf[
70e0: 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  8], aJournalMagi
70f0: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
7100: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20  alMagic));.  rc 
7110: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
7120: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42  (pPager->jfd, zB
7130: 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f  uf, 8+sizeof(aJo
7140: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
7150: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
7160: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
7170: 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  nc;.  return rc;
7180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72  .}../*.** Add or
7190: 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66   remove a page f
71a0: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
71b0: 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61  all pages that a
71c0: 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61  re in the.** sta
71d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
71e0: 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20  **.** The Pager 
71f0: 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74 65  keeps a separate
7200: 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 74   list of pages t
7210: 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
7220: 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74  y in.** the stat
7230: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
7240: 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73  This helps the s
7250: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
7260: 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75  _commit().** rou
7270: 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61  tine run MUCH fa
7280: 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d  ster for the com
7290: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
72a0: 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a  here are many.**
72b0: 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79   pages in memory
72c0: 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20   but only a few 
72d0: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
72e0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  ment journal..*/
72f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7300: 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
7310: 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  st(PgHdr *pPg){.
7320: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
7330: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
7340: 20 69 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74   if( pPg->inStmt
7350: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
7360: 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53  ert( pPg->pPrevS
7370: 74 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  tmt==0 && pPg->p
7380: 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  NextStmt==0 );. 
7390: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
73a0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
73b0: 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  r->pStmt ){.    
73c0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70  pPager->pStmt->p
73d0: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a  PrevStmt = pPg;.
73e0: 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
73f0: 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Stmt = pPager->p
7400: 53 74 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Stmt;.  pPager->
7410: 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70  pStmt = pPg;.  p
7420: 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a  Pg->inStmt = 1;.
7430: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  }.static void pa
7440: 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73  ge_remove_from_s
7450: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
7460: 70 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67  pPg){.  if( !pPg
7470: 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72  ->inStmt ) retur
7480: 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  n;.  if( pPg->pP
7490: 72 65 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  revStmt ){.    a
74a0: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65  ssert( pPg->pPre
74b0: 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74  vStmt->pNextStmt
74c0: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  ==pPg );.    pPg
74d0: 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65  ->pPrevStmt->pNe
74e0: 78 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  xtStmt = pPg->pN
74f0: 65 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65  extStmt;.  }else
7500: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7510: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  g->pPager->pStmt
7520: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  ==pPg );.    pPg
7530: 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ->pPager->pStmt 
7540: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
7550: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
7560: 3e 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20  >pNextStmt ){.  
7570: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7580: 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53  NextStmt->pPrevS
7590: 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  tmt==pPg );.    
75a0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e  pPg->pNextStmt->
75b0: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
75c0: 3e 70 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a  >pPrevStmt;.  }.
75d0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74    pPg->pNextStmt
75e0: 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72   = 0;.  pPg->pPr
75f0: 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  evStmt = 0;.  pP
7600: 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d  g->inStmt = 0;.}
7610: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
7620: 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
7630: 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
7640: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65  page number.  Re
7650: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
7660: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72  r to the page or
7670: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
7680: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  nd..*/.static Pg
7690: 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75  Hdr *pager_looku
76a0: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
76b0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
76c0: 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72  gHdr *p = pPager
76d0: 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61  ->aHash[pager_ha
76e0: 73 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69  sh(pgno)];.  whi
76f0: 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f  le( p && p->pgno
7700: 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20  !=pgno ){.    p 
7710: 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  = p->pNextHash;.
7720: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
7730: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
7740: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
7750: 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65   clear the in-me
7760: 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68 69  mory cache.  Thi
7770: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74  s routine.** set
7780: 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
7790: 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f  he pager back to
77a0: 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68 65   what it was whe
77b0: 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a  n it was first.*
77c0: 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f  * opened.  Any o
77d0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
77e0: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
77f0: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
7800: 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61  attempts.** to a
7810: 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67 65  ccess those page
7820: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  s will likely re
7830: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
7840: 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mp..*/.static vo
7850: 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
7860: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7870: 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
7880: 65 78 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ext;.  if( pPage
7890: 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  r->errCode ) ret
78a0: 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  urn;.  for(pPg=p
78b0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
78c0: 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
78d0: 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
78e0: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c  NextAll;.    sql
78f0: 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
7900: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  }.  pPager->pFir
7910: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
7920: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
7930: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
7940: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
7950: 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d  r->pAll = 0;.  m
7960: 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
7970: 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
7980: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a  Pager->aHash));.
7990: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
79a0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
79b0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
79c0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
79d0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
79e0: 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
79f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e   }.  sqlite3OsUn
7a00: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
7a10: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61   NO_LOCK);.  pPa
7a20: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
7a30: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  ER_UNLOCK;.  pPa
7a40: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
7a50: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
7a60: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7a70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7a80: 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  pen==0 );.}../*.
7a90: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
7aa0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
7ab0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
7ac0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7ad0: 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53  pen and.** a RES
7ae0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
7af0: 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
7b00: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
7b10: 6f 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a  outine releases.
7b20: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
7b30: 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65  lock and acquire
7b40: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  s a SHARED lock 
7b50: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54  in its place.  T
7b60: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
7b70: 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e  le is deleted an
7b80: 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  d closed..**.** 
7b90: 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b  TODO: Consider k
7ba0: 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  eeping the journ
7bb0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72  al file open for
7bc0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
7bd0: 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69  ases..** This mi
7be0: 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f  ght give a perfo
7bf0: 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65  rmance improveme
7c00: 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68  nt on windows wh
7c10: 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61  ere opening.** a
7c20: 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65   file is an expe
7c30: 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e  nsive operation.
7c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7c50: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
7c60: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7c70: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
7c80: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
7c90: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
7ca0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
7cb0: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
7cc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7cd0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73  LITE_OK;.  }.  s
7ce0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
7cf0: 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
7d00: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
7d10: 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  tmtOpen ){.    s
7d20: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
7d30: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
7d40: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
7d50: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  en = 0;.  }.  if
7d60: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
7d70: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
7d80: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
7d90: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70  ger->jfd);.    p
7da0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
7db0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  en = 0;.    sqli
7dc0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
7dd0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
7de0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
7df0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
7e00: 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
7e10: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
7e20: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
7e30: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
7e40: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
7e50: 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  l){.      pPg->i
7e60: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
7e70: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
7e80: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
7e90: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 23 69 66  eedSync = 0;.#if
7ea0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
7eb0: 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
7ec0: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
7ed0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
7ee0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
7ef0: 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
7f00: 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70  Cache = 0;.    p
7f10: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
7f20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
7f30: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
7f40: 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
7f50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
7f60: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
7f70: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   || pPager->useJ
7f80: 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ournal==0 );.  }
7f90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
7fa0: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
7fb0: 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
7fc0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
7fd0: 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
7fe0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  ;.  pPager->orig
7ff0: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  DbSize = 0;.  pP
8000: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
8010: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
8020: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
8030: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
8040: 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
8050: 69 72 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  irst;.  return r
8060: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  c;.}../*.** Comp
8070: 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
8080: 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68   checksum for th
8090: 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a  e page of data..
80a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
80b0: 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
80c0: 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79  m.  It is really
80d0: 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
80e0: 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
80f0: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e  initial value an
8100: 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
8110: 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e  r.  We experimen
8120: 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68  ted with.** a ch
8130: 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e  ecksum of the en
8140: 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74  tire data, but t
8150: 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f  hat was found to
8160: 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a   be too slow..**
8170: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
8180: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
8190: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62   stored at the b
81a0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
81b0: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63   and.** the chec
81c0: 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61  ksum is stored a
81d0: 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73  t the end.  This
81e0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   is important.  
81f0: 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  If journal.** co
8200: 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
8210: 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
8220: 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
8230: 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f   likely scenario
8240: 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20  .** is that one 
8250: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
8260: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
8270: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
8280: 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c   It is.** much l
8290: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
82a0: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
82b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
82c0: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
82d0: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
82e0: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
82f0: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
8300: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
8310: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
8320: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
8330: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
8340: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
8350: 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ruption..**.** F
8360: 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72  IX ME:  Consider
8370: 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30   adding every 20
8380: 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65  0th (or so) byte
8390: 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20   of the data to 
83a0: 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e  the.** checksum.
83b0: 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20    That way if a 
83c0: 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e  single page span
83d0: 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b  s 3 or more disk
83e0: 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20   sectors and.** 
83f0: 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20  only the middle 
8400: 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70  sector is corrup
8410: 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c  t, we will still
8420: 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62   have a reasonab
8430: 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20  le.** chance of 
8440: 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63  failing the chec
8450: 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65  ksum and thus de
8460: 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62  tecting the prob
8470: 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lem..*/.static u
8480: 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
8490: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
84a0: 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 75  no pgno, const u
84b0: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
84c0: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
84d0: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
84e0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
84f0: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
8500: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
8510: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
8520: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
8530: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
8540: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
8550: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
8560: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
8570: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
8580: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8590: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
85a0: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
85b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
85c0: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
85d0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
85e0: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
85f0: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
8600: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
8610: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
8620: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
8630: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
8640: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
8650: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
8660: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
8670: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
8680: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
8690: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
86a0: 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74  OsFile *jfd, int
86b0: 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e   useCksum){.  in
86c0: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
86d0: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
86e0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
86f0: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
8700: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
8710: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
8720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
8730: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
8740: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
8750: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
8760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8770: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
8780: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
8790: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
87a0: 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d  8 aData[SQLITE_M
87b0: 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20  AX_PAGE_SIZE];  
87c0: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
87d0: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
87e0: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
87f0: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
8800: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
8810: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
8820: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
8830: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
8840: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
8850: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
8860: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
8870: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
8880: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
8890: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 0a 0a  ger->stfd) );...
88a0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
88b0: 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20  s(jfd, &pgno);. 
88c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
88d0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
88e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
88f0: 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61  Read(jfd, &aData
8900: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8910: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ze);.  if( rc!=S
8920: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
8930: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
8940: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
8950: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
8960: 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   4;..  /* Sanity
8970: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
8980: 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
8990: 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
89a0: 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
89b0: 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
89c0: 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
89d0: 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
89e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
89f0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
8a00: 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
8a10: 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
8a20: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
8a30: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
8a40: 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
8a50: 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
8a60: 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
8a70: 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
8a80: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8a90: 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
8aa0: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
8ab0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
8ac0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8ad0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8ae0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73  .  if( pgno>(uns
8af0: 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
8b00: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8b10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8b20: 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d  }.  if( useCksum
8b30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
8b40: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b  d32bits(jfd, &ck
8b50: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
8b60: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
8b70: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8b80: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69  lOff += 4;.    i
8b90: 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  f( pager_cksum(p
8ba0: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61  Pager, pgno, aDa
8bb0: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
8bc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8bd0: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
8be0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
8bf0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
8c00: 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50  R_RESERVED || pP
8c10: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
8c20: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
8c30: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
8c40: 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45  er is in RESERVE
8c50: 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
8c60: 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
8c70: 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
8c80: 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
8c90: 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
8ca0: 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
8cb0: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
8cc0: 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
8cd0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
8ce0: 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
8cf0: 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
8d00: 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
8d10: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
8d20: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
8d30: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
8d40: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
8d50: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
8d60: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
8d70: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
8d80: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
8d90: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
8da0: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
8db0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8dc0: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
8dd0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
8de0: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
8df0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
8e00: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
8e10: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
8e20: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
8e30: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
8e40: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
8e50: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
8e60: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
8e70: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
8e80: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
8e90: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
8ea0: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
8eb0: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
8ec0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
8ed0: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
8ee0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
8ef0: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
8f00: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
8f10: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
8f20: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
8f30: 74 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61  ts are in the ma
8f40: 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
8f50: 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72   journal.  Other
8f60: 77 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20  wise, if a full 
8f70: 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20  ROLLBACK occurs 
8f80: 61 66 74 65 72 20 74 68 65 20 73 74 61 74 65 6d  after the statem
8f90: 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
8fa0: 6b 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42  k the full ROLLB
8fb0: 41 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73  ACK will not res
8fc0: 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 74 6f  tore the page to
8fd0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
8fe0: 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f  ** content.  Two
8ff0: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
9000: 20 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77   be met before w
9010: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
9020: 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65  tabase.  ** file
9030: 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
9040: 61 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b  ase must be lock
9050: 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
9060: 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
9070: 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e  al.  ** page con
9080: 74 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d  tent is in the m
9090: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
90a0: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
90b0: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20  age is not in.  
90c0: 2a 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65  ** cache or else
90d0: 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73   it is marked as
90e0: 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
90f0: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
9100: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
9110: 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
9120: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
9130: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
9140: 7c 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 54  || pPg!=0 );.  T
9150: 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20  RACE3("PLAYBACK 
9160: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
9170: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
9180: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
9190: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
91a0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28  R_EXCLUSIVE && (
91b0: 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e  pPg==0 || pPg->n
91c0: 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20  eedSync==0) ){. 
91d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
91e0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
91f0: 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  , (pgno-1)*(i64)
9200: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9210: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
9220: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9230: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9240: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
9250: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
9260: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9270: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 20  }.    if( pPg ) 
9280: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
9290: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
92a0: 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
92b0: 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
92c0: 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
92d0: 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
92e0: 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
92f0: 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
9300: 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
9310: 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
9320: 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
9330: 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
9340: 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
9350: 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
9360: 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
9370: 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
9380: 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
9390: 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
93a0: 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
93b0: 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
93c0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65    ** sqlite3page
93d0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  r_rollback()..  
93e0: 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
93f0: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73  Data;.    /* ass
9400: 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
9410: 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  0 || pPg->pgno==
9420: 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74  1 ); */.    pDat
9430: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
9440: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
9450: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
9460: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9470: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
9480: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
9490: 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a  ){  /*** FIX ME:
94a0: 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65    Should this be
94b0: 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20   xReinit? ***/. 
94c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
94d0: 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
94e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
94f0: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
9500: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
9510: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
9520: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
9530: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
9540: 69 66 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61  if.    CODEC(pPa
9550: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
9560: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20  >pgno, 3);.  }. 
9570: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9580: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
9590: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
95a0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
95b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
95c0: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
95d0: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
95e0: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
95f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
9600: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
9610: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
9620: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
9630: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
9640: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
9650: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9660: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
9670: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
9680: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
9690: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
96a0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
96b0: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
96c0: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
96d0: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
96e0: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
96f0: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
9700: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
9710: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
9720: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
9730: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
9740: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
9750: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
9760: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
9770: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
9780: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
9790: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
97a0: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
97b0: 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ster(const char 
97c0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
97d0: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
97e0: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73  r_open = 0;.  Os
97f0: 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30  File *master = 0
9800: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
9810: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
9820: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
9830: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9840: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
9850: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
9860: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
9870: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
9880: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
9890: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
98a0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
98b0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
98c0: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
98d0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
98e0: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
98f0: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
9900: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
9910: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ence..  */.  rc 
9920: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
9930: 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c  eadOnly(zMaster,
9940: 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28   &master);.  if(
9950: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9960: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
9970: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
9980: 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  en = 1;.  rc = s
9990: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
99a0: 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  (master, &nMaste
99b0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
99c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
99d0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
99e0: 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
99f0: 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
9a00: 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
9a10: 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
9a20: 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20  asterPtr = 0;.. 
9a30: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
9a40: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
9a50: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
9a60: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
9a70: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
9a80: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69  Malloc() and poi
9a90: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
9aa0: 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  erJournal. .    
9ab0: 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f  */.    zMasterJo
9ac0: 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29  urnal = (char *)
9ad0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61  sqliteMalloc(nMa
9ae0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
9af0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
9b00: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
9b10: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
9b20: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
9b30: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
9b40: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
9b50: 65 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c  e3OsRead(master,
9b60: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
9b70: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29   nMasterJournal)
9b80: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
9b90: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
9ba0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
9bb0: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
9bc0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
9bd0: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
9be0: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
9bf0: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
9c00: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  l ){.      if( s
9c10: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
9c20: 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  ts(zJournal) ){.
9c30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
9c40: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
9c50: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
9c60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9c70: 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
9c80: 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
9c90: 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
9ca0: 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
9cb0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
9cc0: 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
9cd0: 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
9ce0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
9cf0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
9d00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f      */.        O
9d10: 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d  sFile *journal =
9d20: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
9d30: 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c;..        rc =
9d40: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
9d50: 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c  adOnly(zJournal,
9d60: 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20   &journal);.    
9d70: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9d80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
9d90: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
9da0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
9db0: 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ..        rc = r
9dc0: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
9dd0: 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74  (journal, &zMast
9de0: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
9df0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
9e00: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
9e10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9e20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
9e30: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
9e40: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
9e50: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
9e60: 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72  terPtr!=0 && str
9e70: 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
9e80: 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
9e90: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
9ea0: 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  zMasterPtr);.   
9eb0: 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
9ec0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
9ed0: 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
9ee0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
9ef0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9f00: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
9f10: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
9f20: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
9f30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75      }.      zJou
9f40: 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28  rnal += (strlen(
9f50: 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
9f60: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c    }.  }.  .  sql
9f70: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
9f80: 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  ster);..delmaste
9f90: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
9fa0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
9fb0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
9fc0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
9fd0: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
9fe0: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
9ff0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
a000: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
a010: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a020: 20 4d 61 6b 65 20 65 76 65 72 79 20 70 61 67 65   Make every page
a030: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 67   in the cache ag
a040: 72 65 65 20 77 69 74 68 20 77 68 61 74 20 69 73  ree with what is
a050: 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74   on disk.  In ot
a060: 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65  her words,.** re
a070: 72 65 61 64 20 74 68 65 20 64 69 73 6b 20 74 6f  read the disk to
a080: 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74 65   reset the state
a090: 20 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   of the cache..*
a0a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a0b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
a0c0: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20  r a rollback in 
a0d0: 77 68 69 63 68 20 73 6f 6d 65 20 6f 66 20 74 68  which some of th
a0e0: 65 20 64 69 72 74 79 20 63 61 63 68 65 0a 2a 2a  e dirty cache.**
a0f0: 20 70 61 67 65 73 20 68 61 64 20 6e 65 76 65 72   pages had never
a100: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f 75   been written ou
a110: 74 20 74 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e  t to disk.  We n
a120: 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  eed to roll back
a130: 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f   the.** cache co
a140: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 65 61  ntent and the ea
a150: 73 69 65 73 74 20 77 61 79 20 74 6f 20 64 6f 20  siest way to do 
a160: 74 68 61 74 20 69 73 20 74 6f 20 72 65 72 65 61  that is to rerea
a170: 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e  d the old conten
a180: 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74  t.** back from t
a190: 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  he disk..*/.stat
a1a0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 6c  ic int pager_rel
a1b0: 6f 61 64 5f 63 61 63 68 65 28 50 61 67 65 72 20  oad_cache(Pager 
a1c0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
a1d0: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
a1e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a1f0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
a200: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
a210: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
a220: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 53 51 4c     char zBuf[SQL
a230: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
a240: 45 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67  E];.    if( !pPg
a250: 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e  ->dirty ) contin
a260: 75 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74  ue;.    if( (int
a270: 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
a280: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
a290: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
a2a0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
a2b0: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
a2c0: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28  >pageSize*(i64)(
a2d0: 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20  pPg->pgno-1));. 
a2e0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
a2f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a300: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a310: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
a320: 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
a330: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
a340: 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  }.      TRACE3("
a350: 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65 20  REFETCH %d page 
a360: 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
a370: 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
a380: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
a390: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
a3a0: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42  CODEC(pPager, zB
a3b0: 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32  uf, pPg->pgno, 2
a3c0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a3d0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c      memset(zBuf,
a3e0: 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
a3f0: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
a400: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
a410: 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66  0 || memcmp(zBuf
a420: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
a430: 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
a440: 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20  geSize) ){.     
a450: 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
a460: 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66  _DATA(pPg), zBuf
a470: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a480: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ze);.      if( p
a490: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
a4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
a4b0: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47  er->xReiniter(PG
a4c0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a4d0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a4e0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
a4f0: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
a500: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
a510: 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
a520: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
a530: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a540: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
a550: 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  c = 0;.    pPg->
a560: 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
a570: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
a580: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
a590: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
a5a0: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
a5b0: 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
a5c0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
a5d0: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
a5e0: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
a5f0: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
a600: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
a610: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f  ** indicated..*/
a620: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
a630: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
a640: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
a650: 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
a660: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
a670: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
a680: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
a690: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
a6a0: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
a6b0: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
a6c0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
a6d0: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
a6e0: 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
a6f0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
a700: 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
a710: 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
a720: 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
a730: 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
a740: 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
a750: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
a760: 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
a770: 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
a780: 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
a790: 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
a7a0: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
a7b0: 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
a7c0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
a7d0: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
a7e0: 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
a7f0: 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
a800: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
a810: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
a820: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
a830: 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
a840: 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
a850: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
a860: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
a870: 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
a880: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
a890: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
a8a0: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
a8b0: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
a8c0: 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
a8d0: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
a8e0: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
a8f0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
a900: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
a910: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
a920: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
a930: 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
a940: 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
a950: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
a960: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
a970: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
a980: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
a990: 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
a9a0: 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
a9b0: 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
a9c0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
a9d0: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
a9e0: 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
a9f0: 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  6)  N bytes of t
aa00: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
aa10: 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
aa20: 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
aa30: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
aa40: 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
aa50: 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
aa60: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
aa70: 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
aa80: 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
aa90: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
aaa0: 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
aab0: 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
aac0: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
aad0: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
aae0: 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
aaf0: 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
ab00: 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (7)  Zero or mor
ab10: 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
ab20: 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
ab30: 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
ab40: 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
ab50: 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
ab60: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
ab70: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
ab80: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
ab90: 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
aba0: 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
abb0: 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
abc0: 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
abd0: 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74  n the first 6 it
abe0: 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
abf0: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
ac00: 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
ac10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74  stance of the 7t
ac20: 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
ac30: 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
ac40: 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
ac50: 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
ac60: 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
ac70: 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
ac80: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
ac90: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
aca0: 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
acb0: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
acc0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
acd0: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
ace0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
acf0: 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
ad00: 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
ad10: 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
ad20: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
ad30: 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
ad40: 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
ad50: 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
ad60: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
ad70: 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
ad80: 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
ad90: 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
ada0: 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
adb0: 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
adc0: 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
add0: 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
ade0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
adf0: 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
ae00: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
ae10: 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
ae20: 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
ae30: 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
ae40: 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
ae50: 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
ae60: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
ae70: 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
ae80: 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
ae90: 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
aea0: 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
aeb0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
aec0: 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
aed0: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
aee0: 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
aef0: 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
af00: 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
af10: 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
af20: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
af30: 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
af40: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
af50: 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
af60: 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
af70: 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
af80: 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
af90: 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
afa0: 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
afb0: 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
afc0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
afd0: 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
afe0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
aff0: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
b000: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
b010: 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
b020: 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
b030: 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
b040: 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
b050: 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
b060: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
b070: 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
b080: 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
b090: 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
b0a0: 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
b0b0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
b0c0: 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
b0d0: 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
b0e0: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
b0f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
b100: 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
b110: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
b120: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
b130: 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
b140: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
b150: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
b160: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b170: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
b180: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
b190: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
b1a0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b1b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b1c0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
b1d0: 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
b1e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b1f0: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
b200: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
b210: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
b220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
b230: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
b240: 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
b250: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
b260: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
b270: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
b280: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
b290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b2a0: 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
b2b0: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
b2c0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
b2d0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
b2e0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
b2f0: 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
b300: 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
b310: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
b320: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
b330: 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
b340: 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
b350: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
b360: 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
b370: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
b380: 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20  lOpen );.  rc = 
b390: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
b3a0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
b3b0: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
b3c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b3d0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b3e0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
b3f0: 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
b400: 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
b410: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
b420: 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
b430: 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
b440: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
b450: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
b460: 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
b470: 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
b480: 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
b490: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
b4a0: 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
b4b0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
b4c0: 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
b4d0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
b4e0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
b4f0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73  ager->jfd, &zMas
b500: 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ter);.  assert( 
b510: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
b520: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
b530: 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74  ITE_OK || (zMast
b540: 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73  er && !sqlite3Os
b550: 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74  FileExists(zMast
b560: 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  er)) ){.    sqli
b570: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
b580: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
b590: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
b5a0: 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
b5b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b5c0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
b5d0: 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  k;.  }.  sqlite3
b5e0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
b5f0: 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72  fd, 0);.  pPager
b600: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
b610: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
b620: 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
b630: 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61  her when the rea
b640: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61  dJournalHdr() ca
b650: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20  ll returns.  ** 
b660: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
b670: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
b680: 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  s. */.  while( 1
b690: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   ){..    /* Read
b6a0: 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
b6b0: 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
b6c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
b6d0: 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
b6e0: 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
b6f0: 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
b700: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
b710: 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
b720: 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
b730: 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
b740: 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
b750: 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
b760: 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
b770: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
b780: 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
b790: 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
b7a0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
b7b0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
b7c0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
b7d0: 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  er, szJ, &nRec, 
b7e0: 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
b7f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b800: 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
b810: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
b820: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
b830: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
b840: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
b850: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
b860: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
b870: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
b880: 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
b890: 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
b8a0: 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
b8b0: 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
b8c0: 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
b8d0: 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
b8e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
b8f0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
b900: 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
b910: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
b920: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
b930: 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
b940: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
b950: 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
b960: 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
b970: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
b980: 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
b990: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
b9a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
b9b0: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
b9c0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
b9d0: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
b9e0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
b9f0: 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
ba00: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
ba10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
ba20: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
ba30: 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
ba40: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
ba50: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
ba60: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
ba70: 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f  e back to it's o
ba80: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
ba90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
baa0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
bab0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 0a  R_EXCLUSIVE && .
bac0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
bad0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
bae0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
baf0: 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  r) ){.      asse
bb00: 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
bb10: 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61  DbSize==0 || pPa
bb20: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d  ger->origDbSize=
bb30: 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72  =mxPg );.      r
bb40: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
bb50: 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
bb60: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
bb70: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bb80: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
bb90: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
bba0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
bbb0: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
bbc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20 3d 20   }..    /* rc = 
bbd0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
bbe0: 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e  ager->jfd, JOURN
bbf0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
bc00: 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  )); */.    if( r
bc10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
bc20: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
bc30: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ;.  .    /* Copy
bc40: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
bc50: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
bc60: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
bc70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
bc80: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
bc90: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
bca0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
bcb0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
bcc0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
bcd0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
bce0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
bcf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bd00: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
bd10: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
bd20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
bd30: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
bd40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bd50: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
bd60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bd70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bd80: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
bd90: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
bda0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bdb0: 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74   }..  /* Pages t
bdc0: 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  hat have been wr
bdd0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
bde0: 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73  rnal but never s
bdf0: 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65  ynced.  ** where
be00: 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79   not restored by
be10: 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e   the loop above.
be20: 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 73    We have to res
be30: 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20  tore those.  ** 
be40: 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e 67  pages by reading
be50: 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20   them back from 
be60: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
be70: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  abase..  */.  as
be80: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
be90: 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f 72  _OK );.  pager_r
bea0: 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
beb0: 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  er);..end_playba
bec0: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
bed0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
bee0: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
bef0: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
bf00: 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72   }.  if( zMaster
bf10: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
bf20: 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
bf30: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
bf40: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
bf50: 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20  eturn true,.    
bf60: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
bf70: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
bf80: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
bf90: 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
bfa0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bfb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
bfc0: 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
bfd0: 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  r(zMaster);.    
bfe0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
bff0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a  (zMaster);.  }..
c000: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
c010: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
c020: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
c030: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
c040: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
c050: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
c060: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
c070: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
c080: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
c090: 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ZE.  ** value. R
c0a0: 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
c0b0: 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
c0c0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
c0d0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   */.  pPager->se
c0e0: 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52  ctorSize = PAGER
c0f0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
c100: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c110: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
c120: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
c130: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  al..**.** This i
c140: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61  s similar to pla
c150: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72  ying back the tr
c160: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
c170: 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20  l but with.** a 
c180: 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73  few extra twists
c190: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
c1a0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
c1b0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
c1c0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
c1d0: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20  start of.**     
c1e0: 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e      the statemen
c1f0: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  t is stored in p
c200: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c  Pager->stmtSize,
c210: 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20   not in the.**  
c220: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66         journal f
c230: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a  ile itself..**.*
c240: 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64  *    (2)  In add
c250: 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67  ition to playing
c260: 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d   back the statem
c270: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  ent journal, als
c280: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
c290: 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
c2a0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
c2b0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
c2c0: 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
c2d0: 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
c2e0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->stmtJSize..*/.
c2f0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
c300: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50  _stmt_playback(P
c310: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
c320: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
c330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
c340: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
c350: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68  urnal */.  i64 h
c360: 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
c370: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
c380: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
c390: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
c3a0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
c3b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
c3c0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
c3d0: 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
c3e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23  r->journalOff;.#
c3f0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20  ifndef NDEBUG . 
c400: 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a   {.    i64 os_sz
c410: 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  J;.    rc = sqli
c420: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
c430: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73  ager->jfd, &os_s
c440: 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  zJ);.    if( rc!
c450: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
c460: 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65  urn rc;.    asse
c470: 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20  rt( szJ==os_szJ 
c480: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
c490: 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74   /* Set hdrOff t
c4a0: 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20  o be the offset 
c4b0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  to the first jou
c4c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
c4d0: 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 73 74  ten.  ** this st
c4e0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
c4f0: 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20  ion, or the end 
c500: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e  of the file if n
c510: 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68  o journal.  ** h
c520: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
c530: 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66  n..  */.  hdrOff
c540: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48   = pPager->stmtH
c550: 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  drOff;.  assert(
c560: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
c570: 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a  c || !hdrOff );.
c580: 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b    if( !hdrOff ){
c590: 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a  .    hdrOff = sz
c5a0: 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  J;.  }.  .  /* T
c5b0: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
c5c0: 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
c5d0: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
c5e0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
c5f0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
c600: 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
c610: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
c620: 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
c630: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
c640: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
c650: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
c660: 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46  tmtSize;..  /* F
c670: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
c680: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
c690: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
c6a0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
c6b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c6c0: 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
c6d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
c6e0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
c6f0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64  eek(pPager->stfd
c700: 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  , 0);.  nRec = p
c710: 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
c720: 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
c730: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
c740: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
c750: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
c760: 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
c770: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
c780: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
c790: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c7a0: 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
c7b0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
c7c0: 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
c7d0: 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
c7e0: 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
c7f0: 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
c800: 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
c810: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52  .  */.  for(i=nR
c820: 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ec-1; i>=0; i--)
c830: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
c840: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
c850: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
c860: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
c870: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
c880: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
c890: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c8a0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
c8b0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
c8c0: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
c8d0: 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
c8e0: 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
c8f0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
c900: 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
c910: 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
c920: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c930: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
c940: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
c950: 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
c960: 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
c970: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
c980: 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
c990: 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
c9a0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
c9b0: 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
c9c0: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
c9d0: 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
c9e0: 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
c9f0: 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
ca00: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
ca10: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
ca20: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
ca30: 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
ca40: 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
ca50: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
ca60: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
ca70: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
ca80: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74  >jfd, pPager->st
ca90: 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
caa0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cab0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74  .    goto end_st
cac0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
cad0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
cae0: 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  alOff = pPager->
caf0: 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61  stmtJSize;.  pPa
cb00: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d  ger->cksumInit =
cb10: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
cb20: 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 4a 4f  um;.  assert( JO
cb30: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
cb40: 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e 70 61  ger)<(pPager->pa
cb50: 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77  geSize+8) );.  w
cb60: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
cb70: 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72  urnalOff <= (hdr
cb80: 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70 61 67  Off-(pPager->pag
cb90: 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20  eSize+8)) ){.   
cba0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
cbb0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
cbc0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
cbd0: 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 1);.    asser
cbe0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
cbf0: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NE );.    if( rc
cc00: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
cc10: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
cc20: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  back;.  }..  whi
cc30: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
cc40: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a  nalOff < szJ ){.
cc50: 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20      u32 nJRec;  
cc60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cc70: 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
cc80: 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
cc90: 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
cca0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
ccb0: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  ager, szJ, &nJRe
ccc0: 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
ccd0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cce0: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
ccf0: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
cd00: 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
cd10: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
cd20: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ck;.    }.    if
cd30: 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20  ( nJRec==0 ){.  
cd40: 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a      nJRec = (szJ
cd50: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
cd60: 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72  alOff) / (pPager
cd70: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20  ->pageSize+8);. 
cd80: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e     }.    for(i=n
cd90: 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20  JRec-1; i>=0 && 
cda0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cdb0: 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a  ff < szJ; i--){.
cdc0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
cdd0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
cde0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
cdf0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
ce00: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
ce10: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
ce20: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ce30: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
ce40: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
ce50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
ce60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
ce70: 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
ce80: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
ce90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ( rc==SQLITE_OK)
cea0: 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   {.    pPager->j
ceb0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
cec0: 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
ced0: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
cee0: 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
cef0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cf00: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
cf10: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
cf20: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
cf30: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
cf40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
cf50: 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69  ager_set_cachesi
cf60: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
cf70: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
cf80: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
cf90: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
cfa0: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
cfb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
cfc0: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
cfd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
cfe0: 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
cff0: 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
d000: 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
d010: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
d020: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
d030: 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
d040: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
d050: 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
d060: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
d070: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
d080: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
d090: 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
d0a0: 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
d0b0: 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
d0c0: 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
d0d0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
d0e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d0f0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
d100: 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
d110: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
d120: 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
d130: 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
d140: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
d150: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
d160: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
d170: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
d180: 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
d190: 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
d1a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d1b0: 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
d1c0: 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
d1d0: 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
d1e0: 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
d1f0: 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
d200: 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
d210: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
d220: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d240: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
d250: 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
d260: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
d270: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
d280: 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
d290: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
d2a0: 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
d2b0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
d2c0: 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
d2d0: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
d2e0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
d2f0: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
d300: 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
d310: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
d320: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
d330: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d340: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
d350: 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
d360: 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
d370: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
d380: 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
d390: 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
d3a0: 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
d3c0: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
d3d0: 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
d3e0: 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
d3f0: 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
d400: 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
d410: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
d420: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
d430: 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
d440: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
d450: 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
d460: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
d470: 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
d480: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
d490: 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
d4a0: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
d4b0: 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
d4c0: 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
d4d0: 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
d4e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d4f0: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
d500: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
d510: 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65  er_set_safety_le
d520: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
d530: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
d540: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
d550: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
d560: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
d570: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
d580: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
d590: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
d5a0: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
d5b0: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
d5c0: 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c  ull_fsync = full
d5d0: 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50  _fsync;.  if( pP
d5e0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
d5f0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
d600: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
d610: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
d620: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
d630: 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
d640: 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
d650: 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
d660: 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
d670: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
d680: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
d690: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
d6a0: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
d6b0: 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e  is only.  .*/.in
d6c0: 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
d6d0: 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f  mp_count = 0;../
d6e0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
d6f0: 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69  orary file.  Wri
d700: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  te the name of t
d710: 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69  he file into zFi
d720: 6c 65 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73  le.** (zFile mus
d730: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 53 51  t be at least SQ
d740: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
d750: 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20  ZE bytes long.) 
d760: 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69   Write.** the fi
d770: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
d780: 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20  to *fd.  Return 
d790: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
d7a0: 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20  cess or some.** 
d7b0: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
d7c0: 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a   if we fail..**.
d7d0: 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  ** The OS will a
d7e0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
d7f0: 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
d800: 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
d810: 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  s.** closed..*/.
d820: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
d830: 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  e3pager_opentemp
d840: 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73  (char *zFile, Os
d850: 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69  File **pFd){.  i
d860: 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e  nt cnt = 8;.  in
d870: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
d880: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
d890: 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
d8a0: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
d8b0: 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f  sis only */.  do
d8c0: 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20  {.    cnt--;.   
d8d0: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
d8e0: 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20  leName(zFile);. 
d8f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d900: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
d910: 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20  File, pFd, 1);. 
d920: 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26   }while( cnt>0 &
d930: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc!=SQLITE_OK 
d940: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
d950: 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
d960: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
d970: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
d980: 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
d990: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
d9a0: 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
d9b0: 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
d9c0: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
d9d0: 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
d9e0: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
d9f0: 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
da00: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
da10: 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  o sqlite3pager_g
da20: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
da30: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
da40: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
da50: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
da60: 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72  ing sqlite3pager
da70: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  _unref()..**.** 
da80: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
da90: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
daa0: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
dab0: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
dac0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
dad0: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
dae0: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
daf0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
db00: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
db10: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
db20: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
db30: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
db40: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
db50: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
db60: 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
db70: 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20  .** It is never 
db80: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
db90: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
dba0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
dbb0: 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  an.** in-memory 
dbc0: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
dbd0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
dbe0: 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70  en(.  Pager **pp
dbf0: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
dc00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
dc10: 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
dc20: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
dc30: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
dc40: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
dc50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
dc60: 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
dc70: 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
dc80: 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
dc90: 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
dca0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
dcb0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcd0: 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
dce0: 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
dcf0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
dd00: 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  er = 0;.  char *
dd10: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
dd20: 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e  0;.  int nameLen
dd30: 3b 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69  ;  /* Compiler i
dd40: 73 20 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73  s wrong. This is
dd50: 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
dd60: 7a 65 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a  zed before use *
dd70: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a  /.  OsFile *fd;.
dd80: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dd90: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
dda0: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
ddb0: 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  0;.  int memDb =
ddc0: 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   0;.  int readOn
ddd0: 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73  ly = 0;.  int us
dde0: 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
ddf0: 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
de00: 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e  OURNAL)==0;.  in
de10: 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
de20: 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
de30: 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20  _READLOCK)!=0;. 
de40: 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
de50: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
de60: 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
de70: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
de80: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41  ANAGEMENT.  /* A
de90: 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74   malloc() cannot
dea0: 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33   fail in sqlite3
deb0: 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20  ThreadData() as 
dec0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c  one or more call
ded0: 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  s to .  ** mallo
dee0: 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c  c() must have al
def0: 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20  ready been made 
df00: 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62  by this thread b
df10: 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20  efore it gets.  
df20: 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ** to this point
df30: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
df40: 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74   ThreadData must
df50: 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
df60: 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a  ated already.  *
df70: 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64  * so that Thread
df80: 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20  Data.nAlloc can 
df90: 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64  be set. It would
dfa0: 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65   be nice to asse
dfb0: 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72  rt.  ** that Thr
dfc0: 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69  eadData.nAlloc i
dfd0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20  s non-zero, but 
dfe0: 61 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b 73  alas this breaks
dff0: 20 74 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a   test cases .  *
e000: 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76  * written to inv
e010: 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20 64 69  oke the pager di
e020: 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54  rectly..  */.  T
e030: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
e040: 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
e050: 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28  ata();.  assert(
e060: 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a   pTsd );.#endif.
e070: 0a 20 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28  .  /* If malloc(
e080: 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61  ) has already fa
e090: 69 6c 65 64 20 72 65 74 75 72 6e 20 53 51 4c 49  iled return SQLI
e0a0: 54 45 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65  TE_NOMEM. Before
e0b0: 20 65 76 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69   even.  ** testi
e0c0: 6e 67 20 66 6f 72 20 74 68 69 73 2c 20 73 65 74  ng for this, set
e0d0: 20 2a 70 70 50 61 67 65 72 20 74 6f 20 4e 55 4c   *ppPager to NUL
e0e0: 4c 20 73 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  L so the caller 
e0f0: 6b 6e 6f 77 73 20 74 68 65 20 70 61 67 65 72 0a  knows the pager.
e100: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 77    ** structure w
e110: 61 73 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74  as never allocat
e120: 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50  ed. .  */.  *ppP
e130: 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ager = 0;.  if( 
e140: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
e150: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74  led() ){.    ret
e160: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e170: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
e180: 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64  fd, 0, sizeof(fd
e190: 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  ));..  /* Open t
e1a0: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e  he pager file an
e1b0: 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e  d set zFullPathn
e1c0: 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ame to point at 
e1d0: 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a  malloc()ed .  **
e1e0: 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69   memory containi
e1f0: 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ng the complete 
e200: 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69  filename (i.e. i
e210: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72  ncluding the dir
e220: 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20  ectory)..  */.  
e230: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
e240: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
e250: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e260: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
e270: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
e280: 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
e290: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
e2a0: 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
e2b0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e2c0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29  sqliteStrDup("")
e2d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
e2e0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
e2f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e300: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
e310: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
e320: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
e330: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
e340: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e350: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
e360: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
e370: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
e380: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e390: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
e3a0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
e3b0: 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64  ntemp(zTemp, &fd
e3c0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
e3d0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46   = zTemp;.    zF
e3e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
e3f0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
e400: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
e410: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e420: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74  TE_OK ){.      t
e430: 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
e440: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
e450: 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 20  ocate the Pager 
e460: 73 74 72 75 63 74 75 72 65 2e 20 41 73 20 70 61  structure. As pa
e470: 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61  rt of the same a
e480: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63  llocation, alloc
e490: 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66  ate.  ** space f
e4a0: 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  or the full path
e4b0: 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64  s of the file, d
e4c0: 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75  irectory and jou
e4d0: 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65  rnal .  ** (Page
e4e0: 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67  r.zFilename, Pag
e4f0: 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e  er.zDirectory an
e500: 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
e510: 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  )..  */.  if( zF
e520: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
e530: 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72     nameLen = str
e540: 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  len(zFullPathnam
e550: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  e);.    pPager =
e560: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
e570: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
e580: 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20   nameLen*3 + 30 
e590: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
e5a0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
e5b0: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
e5c0: 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
e5d0: 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  free the memory 
e5e0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  .  ** pointed to
e5f0: 20 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d   by zFullPathnam
e600: 65 2c 20 66 72 65 65 20 74 68 65 20 50 61 67 65  e, free the Page
e610: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
e620: 63 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  close the .  ** 
e630: 66 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20  file. Since the 
e640: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c  pager is not all
e650: 6f 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20  ocated there is 
e660: 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a  no need to set .
e670: 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65    ** any Pager.e
e680: 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73  rrMask variables
e690: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
e6a0: 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61  ager || !zFullPa
e6b0: 74 68 6e 61 6d 65 20 7c 7c 20 72 63 21 3d 53 51  thname || rc!=SQ
e6c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
e6d0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66  qlite3OsClose(&f
e6e0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  d);.    sqliteFr
e6f0: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
e700: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
e710: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
e720: 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
e730: 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f  TE_OK)?SQLITE_NO
e740: 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20  MEM:rc);.  }..  
e750: 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20  TRACE3("OPEN %d 
e760: 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
e770: 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61  EID(fd), zFullPa
e780: 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65  thname);.  pPage
e790: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  r->zFilename = (
e7a0: 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d  char*)&pPager[1]
e7b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
e7c0: 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
e7d0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65  ->zFilename[name
e7e0: 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72  Len+1];.  pPager
e7f0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50  ->zJournal = &pP
e800: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
e810: 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73  [nameLen+1];.  s
e820: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  trcpy(pPager->zF
e830: 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  ilename, zFullPa
e840: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70  thname);.  strcp
e850: 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  y(pPager->zDirec
e860: 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  tory, zFullPathn
e870: 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e  ame);..  for(i=n
e880: 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70  ameLen; i>0 && p
e890: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e8a0: 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d  y[i-1]!='/'; i--
e8b0: 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20  ){}.  if( i>0 ) 
e8c0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e8d0: 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73  ry[i-1] = 0;.  s
e8e0: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  trcpy(pPager->zJ
e8f0: 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74  ournal, zFullPat
e900: 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  hname);.  sqlite
e910: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
e920: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70  me);.  strcpy(&p
e930: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
e940: 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72  nameLen], "-jour
e950: 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d  nal");.  pPager-
e960: 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70  >fd = fd;.  /* p
e970: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
e980: 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  en = 0; */.  pPa
e990: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
e9a0: 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  = useJournal && 
e9b0: 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  !memDb;.  pPager
e9c0: 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e  ->noReadlock = n
e9d0: 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
e9e0: 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
e9f0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
ea00: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
ea10: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
ea20: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
ea30: 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
ea40: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
ea50: 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67   memDb-1;.  pPag
ea60: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53  er->pageSize = S
ea70: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
ea80: 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50  GE_SIZE;.  /* pP
ea90: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
eaa0: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
eab0: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
eac0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
ead0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
eae0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 4d  .  /* pPager->nM
eaf0: 61 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  axPage = 0; */. 
eb00: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
eb10: 3d 20 31 30 30 3b 0a 20 20 61 73 73 65 72 74 28  = 100;.  assert(
eb20: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30   PAGER_UNLOCK==0
eb30: 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
eb40: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
eb50: 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
eb60: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
eb70: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
eb80: 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70  >tempFile = temp
eb90: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
eba0: 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20  memDb = memDb;. 
ebb0: 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
ebc0: 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20  y = readOnly;.  
ebd0: 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  /* pPager->needS
ebe0: 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ync = 0; */.  pP
ebf0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
ec00: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
ec10: 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  || !useJournal;.
ec20: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
ec30: 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f  nc = (pPager->no
ec40: 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20  Sync?0:1);.  /* 
ec50: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
ec60: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
ec70: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
ec80: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
ec90: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
eca0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
ecb0: 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
ecc0: 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
ecd0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
ece0: 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43  Size = PAGER_SEC
ecf0: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70  TOR_SIZE;.  /* p
ed00: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
ed10: 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
ed20: 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
ed30: 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
ed40: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
ed50: 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
ed60: 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66  = pPager;.#ifdef
ed70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
ed80: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
ed90: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  .  pPager->pNext
eda0: 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b   = pTsd->pPager;
edb0: 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20  .  pTsd->pPager 
edc0: 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66  = pPager;.#endif
edd0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ede0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
edf0: 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
ee00: 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  er function..*/.
ee10: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
ee20: 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64 6c 65  r_set_busyhandle
ee30: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
ee40: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
ee50: 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70  usyHandler){.  p
ee60: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
ee70: 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  ler = pBusyHandl
ee80: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
ee90: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
eea0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
eeb0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
eec0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
eed0: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
eee0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
eef0: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
ef00: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
ef10: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
ef20: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
ef30: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
ef40: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
ef50: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
ef60: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
ef70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
ef80: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
ef90: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
efa0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
efb0: 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72  se().  .** Destr
efc0: 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20  uctors are only 
efd0: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
efe0: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  3pager_unref()..
eff0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
f000: 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63  ager_set_destruc
f010: 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  tor(Pager *pPage
f020: 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29  r, void (*xDesc)
f030: 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20  (void*,int)){.  
f040: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
f050: 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a  tor = xDesc;.}..
f060: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65  /*.** Set the re
f070: 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
f080: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
f090: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  not NULL, the re
f0a0: 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69  initializer.** i
f0b0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
f0c0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
f0d0: 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20  age in cache is 
f0e0: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
f0f0: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  original.** valu
f100: 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
f110: 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68   a rollback.  Th
f120: 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73  e callback gives
f130: 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f   higher-level co
f140: 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75  de.** an opportu
f150: 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20  nity to restore 
f160: 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f  the EXTRA sectio
f170: 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  n to agree with 
f180: 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20  the restored.** 
f190: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f  page data..*/.vo
f1a0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
f1b0: 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61 67  set_reiniter(Pag
f1c0: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
f1d0: 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69 64   (*xReinit)(void
f1e0: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
f1f0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
f200: 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Reinit;.}../*.**
f210: 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69   Set the page si
f220: 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ze.  Return the 
f230: 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74 68  new size.  If th
f240: 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70 61  e suggest new pa
f250: 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e  ge.** size is in
f260: 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65  appropriate, the
f270: 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  n an alternative
f280: 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
f290: 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65  lected.** and re
f2a0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
f2b0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
f2c0: 70 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  pagesize(Pager *
f2d0: 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65  pPager, int page
f2e0: 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
f2f0: 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
f300: 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
f310: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
f320: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
f330: 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  r->memDb ){.    
f340: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f350: 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d   = pageSize;.  }
f360: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
f370: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f  ->pageSize;.}../
f380: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
f390: 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
f3a0: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
f3b0: 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
f3c0: 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
f3d0: 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
f3e0: 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
f3f0: 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
f400: 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
f410: 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
f420: 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
f430: 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
f440: 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
f450: 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
f460: 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
f470: 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
f480: 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
f490: 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
f4a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
f4b0: 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
f4c0: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
f4d0: 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
f4e0: 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
f4f0: 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
f500: 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
f510: 6f 69 64 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61  oid clear_simula
f520: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 7b 0a  ted_io_error(){.
f530: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
f540: 6f 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f  or_hit = 0;.}.vo
f550: 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
f560: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
f570: 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
f580: 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
f590: 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
f5a0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
f5b0: 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
f5c0: 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
f5d0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
f5e0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
f5f0: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
f600: 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
f610: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
f620: 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64   clear_simulated
f630: 5f 69 6f 5f 65 72 72 6f 72 28 29 0a 23 20 64 65  _io_error().# de
f640: 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
f650: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
f660: 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
f670: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
f680: 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
f690: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
f6a0: 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
f6b0: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
f6c0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
f6d0: 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
f6e0: 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
f6f0: 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f  . .**.** No erro
f700: 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  r checking is do
f710: 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ne. The rational
f720: 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
f730: 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
f740: 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  .** may be calle
f750: 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  d even if the fi
f760: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
f770: 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68  t or contain a h
f780: 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68  eader. In .** th
f790: 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65  ese cases sqlite
f7a0: 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72  3OsRead() will r
f7b0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20  eturn an error, 
f7c0: 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72  to which the cor
f7d0: 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73  rect .** respons
f7e0: 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65  e is to zero the
f7f0: 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74   memory at pDest
f800: 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20   and continue.  
f810: 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20  A real IO error 
f820: 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61  .** will presuma
f830: 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65  bly recur and be
f840: 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72   picked up later
f850: 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62   (Todo: Think ab
f860: 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 76 6f  out this)..*/.vo
f870: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
f880: 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28  read_fileheader(
f890: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
f8a0: 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
f8b0: 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d  har *pDest){.  m
f8c0: 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
f8d0: 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d  N);.  if( MEMDB=
f8e0: 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61 62 6c  =0 ){.    disabl
f8f0: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
f900: 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
f910: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
f920: 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 73  r->fd, 0);.    s
f930: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
f940: 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
f950: 4e 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  N);.    enable_s
f960: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
f970: 72 73 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rs();.  }.}../*.
f980: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
f990: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
f9a0: 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ges in the disk 
f9b0: 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
f9c0: 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20  with.** pPager. 
f9d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45  .**.** If the PE
f9e0: 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20  NDING_BYTE lies 
f9f0: 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72 65  on the page dire
fa00: 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 65  ctly after the e
fa10: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  nd of the.** fil
fa20: 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72  e, then consider
fa30: 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74 20   this page part 
fa40: 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e  of the file too.
fa50: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
fa60: 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  .** PENDING_BYTE
fa70: 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28 74   is byte 4096 (t
fa80: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
fa90: 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68 65   page 5) and the
faa0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
fab0: 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79 74  file is 4096 byt
fac0: 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65  es, 5 is returne
fad0: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a  d instead of 4..
fae0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
faf0: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61  ger_pagecount(Pa
fb00: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
fb10: 69 36 34 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  i64 n;.  assert(
fb20: 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
fb30: 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
fb40: 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ze>=0 ){.    n =
fb50: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
fb60: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
fb70: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
fb80: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
fb90: 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , &n)!=SQLITE_OK
fba0: 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
fbb0: 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 53 51  error(pPager, SQ
fbc0: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 20  LITE_IOERR);.   
fbd0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
fbe0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
fbf0: 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
fc00: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20  Size ){.      n 
fc10: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
fc20: 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65        n /= pPage
fc30: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
fc40: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
fc50: 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
fc60: 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
fc70: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
fc80: 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   n;.    }.  }.  
fc90: 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
fca0: 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
fcb0: 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
fcc0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
fcd0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  n;.}../*.** Forw
fce0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
fcf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
fd00: 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
fd10: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  );.../*.** Unlin
fd20: 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
fd30: 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
fd40: 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75   set the page nu
fd50: 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64  mber to 0 to ind
fd60: 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68  icate.** that th
fd70: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61  e page is not pa
fd80: 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63  rt of any hash c
fd90: 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65  hain. This is re
fda0: 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74  quired because t
fdb0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67  he.** sqlite3pag
fdc0: 65 72 5f 6d 6f 76 65 70 61 67 65 28 29 20 72 6f  er_movepage() ro
fdd0: 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20  utine can leave 
fde0: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  a page in the .*
fdf0: 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65  * pNextFree/pPre
fe00: 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20  vFree list that 
fe10: 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66  is not a part of
fe20: 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e   any hash-chain.
fe30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fe40: 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
fe50: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
fe60: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
fe70: 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
fe80: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
fe90: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 7a  page number is z
fea0: 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ero, then this p
feb0: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 61 6e  age is not in an
fec0: 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 2a 2f  y hash chain. */
fed0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
fee0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
fef0: 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  tHash ){.    pPg
ff00: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
ff10: 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
ff20: 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  revHash;.  }.  i
ff30: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
ff40: 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
ff50: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
ff60: 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70  ager_hash(pPg->p
ff70: 67 6e 6f 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20  gno)]!=pPg );.  
ff80: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
ff90: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
ffa0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
ffb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
ffc0: 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50   = pager_hash(pP
ffd0: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
ffe0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
fff0: 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20  ash[h]==pPg );. 
10000 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
10010 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
10020 48 61 73 68 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  Hash;.  }..  pPg
10030 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
10040 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
10050 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
10060 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
10070 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
10080 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
10090 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
100a0 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
100b0 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
100c0 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
100d0 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
100e0 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
100f0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
10100 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
10110 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
10120 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46    /* Keep the pF
10130 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74  irstSynced point
10140 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  er pointing at t
10150 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f  he first synchro
10160 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  nized page */.  
10170 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
10180 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
10190 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
101a0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
101b0 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
101c0 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
101d0 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
101e0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
101f0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
10200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
10210 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  k from the freel
10220 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ist */.  if( pPg
10230 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
10240 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
10250 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
10260 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
10270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
10280 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
10290 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
102a0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
102b0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
102c0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
102d0 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
102e0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
102f0 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
10300 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65  >pPrevFree;.  }e
10310 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
10320 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d   pPager->pLast==
10330 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
10340 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
10350 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20  pPrevFree;.  }. 
10360 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
10370 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
10380 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69   = 0;..  /* Unli
10390 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
103a0 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
103b0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
103c0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
103d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
103e0 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
103f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10400 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
10410 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ncate an in-memo
10420 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 44 65  ry database.  De
10430 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65  lete.** all page
10440 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20  s whose pgno is 
10450 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
10460 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69  er->dbSize and i
10470 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a  s unreferenced..
10480 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
10490 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
104a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
104b0 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74  re zeroed..*/.st
104c0 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79  atic void memory
104d0 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
104e0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
104f0 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
10500 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
10510 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
10520 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
10530 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
10540 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
10550 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
10560 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
10570 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
10580 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
10590 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
105a0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
105b0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
105c0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
105d0 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
105e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
105f0 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
10600 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
10610 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
10620 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
10630 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28       unlinkPage(
10640 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pPg);.      sqli
10650 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
10660 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
10670 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  --;.    }.  }.}.
10680 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 6d 65  #else.#define me
10690 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 29 0a  moryTruncate(p).
106a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
106b0 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
106c0 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49  ck on a file.  I
106d0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
106e0 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
106f0 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  ock.** is curren
10700 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
10710 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c  e.  Repeat until
10720 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
10730 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61  ck returns.** fa
10740 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
10750 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
10760 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
10770 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
10780 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
10790 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
107a0 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
107b0 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
107c0 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
107d0 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
107e0 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
107f0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
10800 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
10810 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
10820 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
10830 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
10840 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
10850 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
10860 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
10870 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  SIVE_LOCK );.  i
10880 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
10890 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
108a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
108b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
108c0 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
108d0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
108e0 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
108f0 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
10900 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
10910 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  && sqlite3Invoke
10920 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
10930 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
10940 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ) );.    if( rc=
10950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10960 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
10970 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
10980 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
10990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
109a0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
109b0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
109c0 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
109d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
109e0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
109f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
10a00 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
10a10 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 70 61   rc;.  sqlite3pa
10a20 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
10a30 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
10a40 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
10a50 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
10a60 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65  >errCode;.    re
10a70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
10a80 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67  f( nPage>=(unsig
10a90 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
10aa0 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
10ab0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10ac0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
10ad0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
10ae0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d  e = nPage;.    m
10af0 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
10b00 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
10b10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10b20 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  .  rc = syncJour
10b30 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69  nal(pPager);.  i
10b40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10b50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10b60 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  c;.  }..  /* Get
10b70 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
10b80 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
10b90 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61  se before trunca
10ba0 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
10bb0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
10bc0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
10bd0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
10be0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10bf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10c00 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61  ;.  }..  rc = pa
10c10 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
10c20 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69  ger, nPage);.  i
10c30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10c40 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
10c50 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
10c60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10c70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
10c80 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
10c90 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
10ca0 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
10cb0 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
10cc0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
10cd0 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
10ce0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
10cf0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
10d00 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
10d10 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
10d20 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
10d30 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
10d40 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
10d50 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
10d60 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
10d70 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
10d80 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
10d90 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
10da0 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
10db0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
10dc0 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
10dd0 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
10de0 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ump..**.** This 
10df0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
10e00 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74  succeeds. If a t
10e10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
10e20 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a  tive an attempt.
10e30 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f  ** is made to ro
10e40 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61  ll it back. If a
10e50 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
10e60 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
10e70 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75  ck .** a hot jou
10e80 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74  rnal may be left
10e90 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
10ea0 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  em but no error 
10eb0 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74  is returned.** t
10ec0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
10ed0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
10ee0 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  r_close(Pager *p
10ef0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
10f00 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 23 69  *pPg, *pNext;.#i
10f10 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10f20 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
10f30 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c  MENT.  /* A mall
10f40 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  oc() cannot fail
10f50 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61   in sqlite3Threa
10f60 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f  dData() as one o
10f70 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20  r more calls to 
10f80 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d  .  ** malloc() m
10f90 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
10fa0 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68   been made by th
10fb0 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65  is thread before
10fc0 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f   it gets.  ** to
10fd0 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69   this point. Thi
10fe0 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65  s means the Thre
10ff0 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65  adData must have
11000 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
11010 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20  already.  ** so 
11020 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
11030 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65  nAlloc can be se
11040 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64  t..  */.  Thread
11050 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c  Data *pTsd = sql
11060 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29  ite3ThreadData()
11070 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11080 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
11090 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41  pTsd && pTsd->nA
110a0 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  lloc );.#endif..
110b0 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72    switch( pPager
110c0 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63  ->state ){.    c
110d0 61 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56  ase PAGER_RESERV
110e0 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47  ED:.    case PAG
110f0 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20  ER_SYNCED: .    
11100 63 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55  case PAGER_EXCLU
11110 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  SIVE: {.      /*
11120 20 57 65 20 69 67 6e 6f 72 65 20 61 6e 79 20 49   We ignore any I
11130 4f 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f 63  O errors that oc
11140 63 75 72 20 64 75 72 69 6e 67 20 74 68 65 20 72  cur during the r
11150 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a  ollback.      **
11160 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 6f 20 64   operation. So d
11170 69 73 61 62 6c 65 20 49 4f 20 65 72 72 6f 72 20  isable IO error 
11180 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f 20 74 68  simulation so th
11190 61 74 20 74 65 73 74 69 6e 67 0a 20 20 20 20 20  at testing.     
111a0 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72 65 20 65   ** works more e
111b0 61 73 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  asily..      */.
111c0 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69        disable_si
111d0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
111e0 73 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s();.      sqlit
111f0 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
11200 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
11210 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
11220 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
11230 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
11240 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11250 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
11260 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
11270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
11280 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
11290 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  rCode || pPager-
112a0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
112b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
112c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
112d0 41 47 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20  AGER_SHARED: {. 
112e0 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20       if( !MEMDB 
112f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11300 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
11310 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
11320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11330 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
11340 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
11350 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
11360 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
11370 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
11380 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
11390 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
113a0 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
113b0 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
113c0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
113d0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
113e0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
113f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
11400 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
11410 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
11420 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
11430 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
11440 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
11450 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
11460 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 78  .#endif.    pNex
11470 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
11480 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  l;.    sqliteFre
11490 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52  e(pPg);.  }.  TR
114a0 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE2("CLOSE %d\n
114b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
114c0 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r));.  assert( p
114d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
114e0 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
114f0 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61  alOpen==0 && pPa
11500 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30  ger->stmtOpen==0
11510 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
11520 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
11530 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11540 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  lose(&pPager->jf
11550 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
11560 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
11570 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
11580 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
11590 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
115a0 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
115b0 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  stfd);.  }.  sql
115c0 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
115d0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54  ger->fd);.  /* T
115e0 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75  emp files are au
115f0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
11600 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20  ted by the OS.  
11610 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  ** if( pPager->t
11620 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20  empFile ){.  ** 
11630 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
11640 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
11650 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a  ame);.  ** }.  *
11660 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
11670 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
11680 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  ANAGEMENT.  /* R
11690 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20  emove the pager 
116a0 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20  from the linked 
116b0 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 73  list of pagers s
116c0 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a  tarting at .  **
116d0 20 54 68 72 65 61 64 44 61 74 61 2e 70 50 61 67   ThreadData.pPag
116e0 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  er if memory-man
116f0 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
11700 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
11710 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61  Pager==pTsd->pPa
11720 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d  ger ){.    pTsd-
11730 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
11740 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
11750 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d  {.    Pager *pTm
11760 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20  p;.    for(pTmp 
11770 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20  = pTsd->pPager; 
11780 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61  pTmp->pNext!=pPa
11790 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e  ger; pTmp=pTmp->
117a0 70 4e 65 78 74 29 3b 0a 20 20 20 20 70 54 6d 70  pNext);.    pTmp
117b0 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72  ->pNext = pPager
117c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e  ->pNext;.  }.#en
117d0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 46 72 65  dif..  sqliteFre
117e0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
117f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11800 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11810 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
11820 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
11830 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
11840 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
11850 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
11860 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
11870 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
11880 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
11890 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
118a0 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
118b0 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
118c0 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
118d0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
118e0 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
118f0 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
11900 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
11910 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
11920 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
11930 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
11940 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
11950 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
11960 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
11970 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
11980 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
11990 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
119a0 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
119b0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
119c0 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
119d0 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
119e0 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
119f0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
11a00 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
11a10 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
11a20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
11a30 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
11a40 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
11a50 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
11a60 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
11a70 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
11a80 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
11a90 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
11aa0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
11ab0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
11ac0 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
11ad0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
11ae0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
11af0 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
11b00 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
11b10 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
11b20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
11b30 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
11b40 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
11b50 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
11b60 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
11b70 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
11b80 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
11b90 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
11ba0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
11bb0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
11bc0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
11bd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11be0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
11bf0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
11c00 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
11c10 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
11c20 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
11c30 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
11c40 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
11c50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
11c60 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
11c70 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
11c80 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
11c90 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
11ca0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11cb0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
11cc0 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
11cd0 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
11ce0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
11cf0 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
11d00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11d10 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
11d20 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70  .      REFINFO(p
11d30 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Pg);.    }.  }.#
11d40 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
11d50 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
11d60 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
11d70 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
11d80 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
11d90 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
11da0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
11db0 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
11dc0 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
11dd0 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
11de0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
11df0 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
11e00 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
11e10 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
11e20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
11e30 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
11e40 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  a);.  page_ref(p
11e50 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
11e60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11e70 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
11e80 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
11e90 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
11ea0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
11eb0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
11ec0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
11ed0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
11ee0 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
11ef0 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
11f00 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
11f10 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
11f20 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
11f30 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
11f40 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
11f50 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
11f60 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
11f70 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
11f80 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
11f90 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
11fa0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
11fb0 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
11fc0 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
11fd0 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
11fe0 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
11ff0 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
12000 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
12010 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
12020 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
12030 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
12040 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
12050 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
12060 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12070 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
12080 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
12090 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
120a0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
120b0 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
120c0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
120d0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
120e0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
120f0 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
12100 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
12110 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
12120 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
12130 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
12140 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
12150 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
12160 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
12170 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
12180 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
12190 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
121a0 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
121b0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
121c0 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
121d0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
121e0 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
121f0 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
12200 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
12210 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
12220 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
12230 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
12240 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
12250 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
12260 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
12270 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
12280 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
12290 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
122a0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
122b0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
122c0 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
122d0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
122e0 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
122f0 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
12300 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
12310 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
12320 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12330 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
12340 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
12350 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
12360 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12370 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
12380 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
12390 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
123a0 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
123b0 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
123c0 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
123d0 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
123e0 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
123f0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
12400 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
12410 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
12420 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
12430 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
12440 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
12450 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
12460 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
12470 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
12480 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
12490 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
124a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
124b0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
124c0 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
124d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
124e0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
124f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
12500 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
12510 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
12520 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
12530 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
12540 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20  alOff==jSz );.  
12550 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12560 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
12570 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
12580 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
12590 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
125a0 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
125b0 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
125c0 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
125d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
125e0 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
125f0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
12600 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
12610 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
12620 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
12630 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
12640 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
12650 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
12660 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20   rollback. .    
12670 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
12680 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
12690 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
126a0 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
126b0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
126c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
126d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
126e0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
126f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
12700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
12710 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
12720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12730 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12740 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
12750 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
12770 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12780 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
12790 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
127a0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
127b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72  rn rc;.        r
127c0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
127d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
127e0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20  ger->nRec);.    
127f0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
12800 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  urn rc;..       
12810 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
12820 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
12830 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12840 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
12850 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12870 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
12880 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
12890 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
128a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
128b0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
128c0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  ->jfd, pPager->f
128d0 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20  ull_fsync);.    
128e0 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
128f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
12900 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
12910 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
12920 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
12930 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
12940 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
12950 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
12960 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
12970 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
12980 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
12990 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
129a0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
129b0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
129c0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
129d0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
129e0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
129f0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
12a00 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
12a10 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
12a20 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65  lag is clear the
12a30 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  n the PgHdr.need
12a40 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d  Sync.  ** flag m
12a50 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61  ust also be clea
12a60 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e  r for all pages.
12a70 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
12a80 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e  is.  ** invarian
12a90 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a  t is true..  */.
12aa0 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28    else{.    for(
12ab0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
12ac0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
12ad0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
12ae0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
12af0 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
12b00 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
12b10 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12b20 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  ced==pPager->pFi
12b30 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
12b40 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
12b50 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
12b60 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
12b70 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
12b80 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
12b90 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
12ba0 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
12bb0 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
12bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12bd0 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
12be0 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
12bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12c00 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
12c10 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
12c20 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
12c30 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
12c40 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
12c50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12c60 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
12c70 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
12c80 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
12c90 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
12ca0 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
12cb0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
12cc0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
12cd0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
12ce0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
12cf0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12d00 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
12d10 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
12d20 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
12d30 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
12d40 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
12d50 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
12d60 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
12d70 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
12d80 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
12d90 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
12da0 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
12db0 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
12dc0 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
12dd0 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
12de0 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
12df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
12e00 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
12e10 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
12e20 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
12e30 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
12e40 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
12e50 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
12e60 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
12e70 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
12e80 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
12e90 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
12ea0 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
12eb0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
12ec0 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
12ed0 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
12ee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
12ef0 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
12f00 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
12f10 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
12f20 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
12f30 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
12f40 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
12f50 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
12f60 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
12f70 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
12f80 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
12f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12fa0 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
12fb0 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
12fc0 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
12fd0 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
12fe0 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
12ff0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
13000 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
13010 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
13020 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
13030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
13040 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
13050 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
13060 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
13070 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
13080 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
13090 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ek(pPager->fd, (
130a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
130b0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
130c0 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Size);.    if( r
130d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
130e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
130f0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
13100 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
13110 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
13120 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
13130 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
13140 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
13150 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
13160 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
13170 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
13180 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
13190 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
131a0 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
131b0 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
131c0 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
131d0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
131e0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
131f0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
13200 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
13210 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  ){.      CODEC(p
13220 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
13230 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
13240 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20  st->pgno, 6);.  
13250 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4f 52      TRACE3("STOR
13260 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
13270 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
13280 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
13290 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
132a0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
132b0 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
132c0 41 54 41 28 70 4c 69 73 74 29 2c 0a 20 20 20 20  ATA(pList),.    
132d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132e0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
132f0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
13300 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
13310 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
13320 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
13330 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 45 53  o, 0);.      TES
13340 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
13350 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69  Write);.    }.#i
13360 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
13370 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41   else{.      TRA
13380 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE3("NOSTORE %d 
13390 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
133a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
133b0 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  st->pgno);.    }
133c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
133d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
133e0 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
133f0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
13400 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
13410 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
13420 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
13430 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
13440 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
13450 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
13460 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
13470 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13480 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
13490 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
134a0 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
134b0 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
134c0 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
134d0 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
134e0 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
134f0 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
13500 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
13510 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
13520 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
13530 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
13540 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
13550 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a  ){.  PgHdr *p, *
13560 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d  pList;.  pList =
13570 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67   0;.  for(p=pPag
13580 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
13590 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
135a0 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b   if( p->dirty ){
135b0 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79  .      p->pDirty
135c0 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
135d0 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d  pList = p;.    }
135e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
135f0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ist;.}../*.** Re
13600 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
13610 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
13620 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  nal on the given
13630 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74   pager..** A hot
13640 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
13650 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
13660 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a   played back..**
13670 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
13680 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
13690 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
136a0 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
136b0 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
136c0 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
136d0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
136e0 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
136f0 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
13700 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
13710 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c   name.  Just del
13720 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
13730 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
13740 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
13750 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
13760 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  f( !pPager->useJ
13770 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20  ournal ) return 
13780 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
13790 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
137a0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
137b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
137c0 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  ( sqlite3OsCheck
137d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
137e0 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75 72  ger->fd) ) retur
137f0 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 0;.  if( sqlit
13800 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
13810 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
13820 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
13830 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
13840 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  rnal);.    retur
13850 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
13860 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
13870 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
13880 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
13890 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61  he cache that ca
138a0 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a  n be recycled. .
138b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
138c0 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ne may return SQ
138d0 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
138e0 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54  TE_FULL or SQLIT
138f0 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65  E_OK. It .** doe
13900 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50  s not set the pP
13910 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61  ager->errCode va
13920 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
13930 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79  c int pager_recy
13940 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  cle(Pager *pPage
13950 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50  r, int syncOk, P
13960 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20  gHdr **ppPg){.  
13970 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70  PgHdr *pPg;.  *p
13980 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46  pPg = 0;..  /* F
13990 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
139a0 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
139b0 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
139c0 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  t does not.  ** 
139d0 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
139e0 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
139f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  he journal..  */
13a00 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d  .  pPg = pPager-
13a10 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
13a20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
13a30 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
13a40 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
13a50 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
13a60 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f  ).  ** on the jo
13a70 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
13a80 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
13a90 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
13aa0 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f   a.  ** very slo
13ab0 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
13ac0 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
13ad0 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
13ae0 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74  ometimes.  ** it
13af0 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
13b00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
13b10 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
13b20 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20  First && syncOk 
13b30 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20  && !MEMDB){.    
13b40 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
13b50 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
13b60 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
13b70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13b80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
13b90 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
13ba0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e  {.      /* If in
13bb0 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
13bc0 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
13bd0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
13be0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   the.      ** jo
13bf0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
13c00 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
13c10 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
13c20 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
13c30 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
13c40 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
13c50 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
13c60 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
13c70 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
13c80 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
13c90 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
13ca0 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
13cb0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   is.      ** tra
13cc0 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
13cd0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
13ce0 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ted)..      */. 
13cf0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
13d00 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
13d10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13d20 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
13d30 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
13d40 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
13d50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
13d70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
13d80 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
13d90 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
13da0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
13db0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
13dc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
13dd0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13de0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
13df0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
13e00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
13e10 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
13e20 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ty..  */.  if( p
13e30 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
13e40 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
13e50 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
13e60 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 67  nc==0 );.    pPg
13e70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
13e80 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
13e90 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
13ea0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
13eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13ec0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13ed0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
13ee0 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
13ef0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
13f00 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
13f10 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
13f20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
13f30 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74  k, then.  ** set
13f40 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
13f50 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
13f60 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
13f70 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
13f80 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
13f90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
13fa0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
13fb0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
13fc0 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
13fd0 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
13fe0 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
13ff0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
14000 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
14010 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
14020 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
14030 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
14040 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
14050 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
14060 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
14070 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
14080 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
14090 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
140a0 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
140b0 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
140c0 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
140d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
140e0 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
140f0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
14100 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
14110 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74  }..  /* Unlink t
14120 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d  he old page from
14130 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61   the free list a
14140 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nd the hash tabl
14150 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50  e.  */.  unlinkP
14160 61 67 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54  age(pPg);.  TEST
14170 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f  _INCR(pPager->nO
14180 76 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d  vfl);..  *ppPg =
14190 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
141a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
141b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
141c0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72   is called to fr
141d0 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64  ee superfluous d
141e0 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
141f0 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68  ated memory.** h
14200 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72  eld by the pager
14210 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20   system. Memory 
14220 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51  in use by any SQ
14230 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63  Lite pager alloc
14240 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
14250 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61  urrent thread ma
14260 79 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28  y be sqliteFree(
14270 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20  )ed..**.** nReq 
14280 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
14290 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
142a0 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20   required. Once 
142b0 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a  this much has.**
142c0 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20   been released, 
142d0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
142e0 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65  urns. A negative
142f0 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20   value for nReq 
14300 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73  means.** free as
14310 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
14320 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65  possible. The re
14330 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
14340 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
14350 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
14360 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
14370 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14380 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
14390 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71  ANAGEMENT.int sq
143a0 6c 69 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61  lite3pager_relea
143b0 73 65 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e 52  se_memory(int nR
143c0 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72  eq){.  const Thr
143d0 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20  eadData *pTsdro 
143e0 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
143f0 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
14400 20 50 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74   Pager *p;.  int
14410 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a   nReleased = 0;.
14420 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49    int i;..  /* I
14430 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c  f the the global
14440 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
14450 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
14460 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f  becomes a.  ** o
14470 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20  -op; zero bytes 
14480 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72  of memory are fr
14490 65 65 64 2e 20 20 54 68 69 73 20 69 73 20 62 65  eed.  This is be
144a0 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20  cause.  ** some 
144b0 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f  of the code invo
144c0 6b 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ked by this func
144d0 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20  tion may also.  
144e0 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** try to obtain
144f0 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75   the mutex, resu
14500 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c  lting in a deadl
14510 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
14520 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78  sqlite3OsInMutex
14530 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (0) ){.    retur
14540 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  n 0;.  }..  /* O
14550 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75  utermost loop ru
14560 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74  ns for at most t
14570 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46  wo iterations. F
14580 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77  irst iteration w
14590 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69  e.  ** try to fi
145a0 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63  nd memory that c
145b0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77  an be released w
145c0 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66  ithout calling f
145d0 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20  sync(). Second. 
145e0 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77   ** iteration (w
145f0 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69  hich only runs i
14600 66 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c  f the first fail
14610 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20  ed to free nReq 
14620 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65  bytes of.  ** me
14630 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74  mory) is permitt
14640 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63  ed to call fsync
14650 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63  (). This is of c
14660 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20  ourse much more 
14670 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e  .  ** expensive.
14680 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
14690 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20   i<=1; i++){..  
146a0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
146b0 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65  h all the SQLite
146c0 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62   pagers opened b
146d0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
146e0 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  read. */.    for
146f0 28 70 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65  (p=pTsdro->pPage
14700 72 3b 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20  r; p && (nReq<0 
14710 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65  || nReleased<nRe
14720 71 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  q); p=p->pNext){
14730 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
14740 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  g;.      int rc;
14750 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  ..      /* For e
14760 61 63 68 20 70 61 67 65 72 2c 20 74 72 79 20 74  ach pager, try t
14770 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70  o free as many p
14780 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ages as possible
14790 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20   (without .     
147a0 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e   ** calling fsyn
147b0 63 28 29 20 69 66 20 74 68 69 73 20 69 73 20 74  c() if this is t
147c0 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
147d0 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d  on of the outerm
147e0 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  ost .      ** lo
147f0 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  op)..      */.  
14800 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
14810 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65  E_OK==(rc = page
14820 72 5f 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20  r_recycle(p, i, 
14830 26 70 50 67 29 29 20 26 26 20 70 50 67 29 20 7b  &pPg)) && pPg) {
14840 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76  .        /* We'v
14850 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74  e found a page t
14860 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20  o free. At this 
14870 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68  point the page h
14880 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  as been .       
14890 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   ** removed from
148a0 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74   the page hash-t
148b0 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20  able, free-list 
148c0 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20  and synced-list 
148d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69  .        ** (pFi
148e0 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69  rstSynced). It i
148f0 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61  s still in the a
14900 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20  ll pages (pAll) 
14910 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
14920 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * Remove it from
14930 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72   this list befor
14940 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20  e freeing..     
14950 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
14960 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65   Todo: Check the
14970 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73   Pager.pStmt lis
14980 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
14990 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20  his is Ok. It . 
149a0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62         ** probab
149b0 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20  ly is though..  
149c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
149d0 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20   PgHdr *pTmp;.  
149e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
149f0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  g );.        pag
14a00 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
14a10 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
14a20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
14a30 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
14a40 20 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70       p->pAll = p
14a50 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
14a60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14a70 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70         for( pTmp
14a80 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e  =p->pAll; pTmp->
14a90 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70  pNextAll!=pPg; p
14aa0 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41  Tmp=pTmp->pNextA
14ab0 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ll );.          
14ac0 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d  pTmp->pNextAll =
14ad0 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
14ae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14af0 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73    nReleased += s
14b00 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70  qliteAllocSize(p
14b10 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Pg);.        sql
14b20 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
14b30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
14b40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14b50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  {.        /* An 
14b60 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
14b70 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
14b80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14b90 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  e or .        **
14ba0 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65   journal in page
14bb0 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65  r_recycle(). The
14bc0 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65   error is not re
14bd0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20  turned to the . 
14be0 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72         ** caller
14bf0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
14c00 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20  n. Instead, set 
14c10 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64  the Pager.errCod
14c20 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20  e variable..    
14c30 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72      ** The error
14c40 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
14c50 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f  d to the user (o
14c60 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20  r users, in the 
14c70 63 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  case .        **
14c80 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67   of a shared pag
14c90 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65  er cache) of the
14ca0 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
14cb0 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
14cc0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
14cd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
14ce0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  c==SQLITE_IOERR 
14cf0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  || rc==SQLITE_FU
14d00 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  LL );.        as
14d10 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d  sert( p->state>=
14d20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
14d30 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  ;.        pager_
14d40 65 72 72 6f 72 28 70 2c 20 72 63 29 3b 0a 20 20  error(p, rc);.  
14d50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14d60 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61  .  return nRelea
14d70 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  sed;.}.#endif /*
14d80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
14d90 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
14da0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69   */../*.** Acqui
14db0 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  re a page..**.**
14dc0 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   A read lock on 
14dd0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73  the disk file is
14de0 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74   obtained when t
14df0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73  he first page is
14e00 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54   acquired. .** T
14e10 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  his read lock is
14e20 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68   dropped when th
14e30 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  e last page is r
14e40 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eleased..**.** A
14e50 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20   _get works for 
14e60 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20  any page number 
14e70 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20  greater than 0. 
14e80 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
14e90 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c  .** file is smal
14ea0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
14eb0 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65  uested page, the
14ec0 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b  n no actual disk
14ed0 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20  .** read occurs 
14ee0 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  and the memory i
14ef0 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  mage of the page
14f00 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
14f10 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e  to.** all zeros.
14f20 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61    The extra data
14f30 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
14f40 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
14f50 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20  itialized.** to 
14f60 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20  zeros the first 
14f70 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
14f80 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
14f90 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  y..**.** The acq
14fa0 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
14fb0 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
14fc0 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
14fd0 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
14fe0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
14ff0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
15000 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
15010 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
15020 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
15030 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
15040 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
15050 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75  utine and _looku
15060 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
15070 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
15080 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
15090 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
150a0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
150b0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
150c0 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
150d0 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
150e0 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
150f0 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a  ereas _lookup().
15100 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
15110 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
15120 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
15130 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
15140 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
15150 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
15160 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
15170 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
15180 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
15190 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f  y..** Since _loo
151a0 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
151b0 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
151c0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
151d0 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
151e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
151f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
15200 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50  er_get(Pager *pP
15210 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
15220 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b   void **ppPage){
15230 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
15240 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
15250 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
15260 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
15270 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
15280 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
15290 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
152a0 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
152b0 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
152c0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
152d0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
152e0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
152f0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
15300 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
15310 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15320 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
15330 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
15340 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
15350 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
15360 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
15370 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15380 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
15390 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
153a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
153b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
153c0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
153d0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
153e0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
153f0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
15400 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
15410 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67  accessed, then g
15420 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  et a SHARED lock
15430 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
15440 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
15450 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
15460 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42  Ref==0 && !MEMDB
15470 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
15480 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
15490 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
154a0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
154b0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
154c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
154d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
154e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
154f0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
15500 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
15510 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
15520 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
15530 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
15540 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
15550 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
15560 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
15570 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
15580 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
15590 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
155a0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
155b0 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75     if( hasHotJou
155c0 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  rnal(pPager) ){.
155d0 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e         /* Get an
155e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
155f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15600 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
15610 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
15620 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
15630 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
15640 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
15650 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
15660 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45   the.       ** E
15670 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
15680 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
15690 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
156a0 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
156b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
156c0 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
156d0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
156e0 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
156f0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74  he.       ** dat
15700 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
15710 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
15720 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
15730 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
15740 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
15750 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
15760 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
15770 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
15780 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
15790 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
157a0 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64         ** second
157b0 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65   process will ge
157c0 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20  t to this point 
157d0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
157e0 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a  fail to.       *
157f0 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77  * obtain it's ow
15800 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
15810 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
15820 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f   file..       */
15830 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  .       rc = sql
15840 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
15850 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
15860 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69  _LOCK);.       i
15870 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   ){.         sql
15890 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
158a0 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
158b0 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  );.         pPag
158c0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
158d0 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
158e0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
158f0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
15900 29 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  );.       }.    
15910 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
15920 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
15930 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f  VE;..       /* O
15940 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
15950 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79  for reading only
15960 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
15970 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
15980 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  ** we are unable
15990 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
159a0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20  rnal file. .    
159b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20     **.       ** 
159c0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
159d0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
159e0 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65  o be locked itse
159f0 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  lf.  The.       
15a00 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
15a10 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e  is never open un
15a20 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64 61  less the main da
15a30 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
15a40 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77 72  s.       ** a wr
15a50 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65  ite lock, so the
15a60 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 20  re is never any 
15a70 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72  chance of two or
15a80 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a 20   more.       ** 
15a90 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69 6e  processes openin
15aa0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74  g the journal at
15ab0 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
15ac0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15ad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
15ae0 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61 67  penReadOnly(pPag
15af0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
15b00 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
15b10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15b30 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
15b40 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
15b50 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
15b60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
15b70 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
15b80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15b90 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
15ba0 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67     }.       pPag
15bb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
15bc0 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 1;.       pPag
15bd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
15be0 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  ed = 0;.       p
15bf0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15c00 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  f = 0;.       pP
15c10 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
15c20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 0;.       pPag
15c30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
15c40 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50   0;..       /* P
15c50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
15c60 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
15c70 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
15c80 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 20  se write.       
15c90 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
15ca0 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
15cb0 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ock..       */. 
15cc0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15cd0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
15ce0 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
15cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15d00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
15d10 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
15d20 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 7d  r, rc);.       }
15d30 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
15d40 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
15d50 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70   /* Search for p
15d60 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  age in cache */.
15d70 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
15d80 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
15d90 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  gno);.    if( ME
15da0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 73  MDB && pPager->s
15db0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
15dc0 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
15dd0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
15de0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
15df0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
15e00 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
15e10 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
15e20 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65   not in the page
15e30 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69   cache. */.    i
15e40 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f 49  nt h;.    TEST_I
15e50 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73  NCR(pPager->nMis
15e60 73 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  s);.    if( pPag
15e70 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72  er->nPage<pPager
15e80 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67  ->mxPage || pPag
15e90 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c  er->pFirst==0 ||
15ea0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
15eb0 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
15ec0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50  page */.      pP
15ed0 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
15ee0 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67  Raw( sizeof(*pPg
15ef0 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) + pPager->page
15f00 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
15f30 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
15f40 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
15f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f60 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
15f70 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
15f80 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
15f90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
15fa0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
15fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
15fc0 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f  et(pPg, 0, sizeo
15fd0 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20  f(*pPg));.      
15fe0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
15ff0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
16000 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
16010 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
16020 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
16030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
16040 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
16050 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  r;.      pPg->pN
16060 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
16070 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61  >pAll;.      pPa
16080 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
16090 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
160a0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
160b0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
160c0 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
160d0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
160e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78  rt( pPager->nMax
160f0 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e  Page==(pPager->n
16100 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20  Page-1) );.     
16110 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50     pPager->nMaxP
16120 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  age++;.      }. 
16130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16140 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
16150 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  le(pPager, 1, &p
16160 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
16170 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16180 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16190 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
161a0 20 61 73 73 65 72 74 28 70 50 67 29 20 3b 0a 20   assert(pPg) ;. 
161b0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67     }.    pPg->pg
161c0 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69  no = pgno;.    i
161d0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
161e0 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
161f0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
16200 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
16210 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
16220 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
16230 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
16240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
16250 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16260 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
16270 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
16280 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
16290 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
162a0 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
162b0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
162c0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
162d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
162e0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
162f0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
16300 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
16310 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
16320 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
16330 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
16340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
16350 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d   (pPager->aInStm
16360 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
16370 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
16380 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
16390 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
163a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
163b0 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
163c0 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70  from_stmt_list(p
163d0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
163e0 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
163f0 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
16400 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
16410 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  g);..    pPager-
16420 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28  >nRef++;.    if(
16430 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
16440 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
16450 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
16460 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
16470 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
16480 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16490 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
164a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
164b0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
164c0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
164d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61  ;.      rc = pPa
164e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
164f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16500 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70     }..    /* Pop
16510 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77  ulate the page w
16520 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72  ith data, either
16530 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   by reading from
16540 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
16550 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79    ** file, or by
16560 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74   setting the ent
16570 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f  ire page to zero
16580 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16590 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
165a0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3c  gecount(pPager)<
165b0 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
165c0 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  DB ){.      mems
165d0 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
165e0 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
165f0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
16600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
16610 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
16620 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
16630 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
16640 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
16650 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
16660 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
16670 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16680 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16690 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
166a0 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
166b0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20  TO_DATA(pPg),.  
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
166e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
166f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
16700 43 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61  CE3("FETCH %d pa
16710 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
16720 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
16730 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44  pgno);.      COD
16740 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  EC(pPager, PGHDR
16750 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
16760 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
16770 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16780 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16790 20 69 36 34 20 66 69 6c 65 53 69 7a 65 3b 0a 20   i64 fileSize;. 
167a0 20 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d         int rc2 =
167b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
167c0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
167d0 66 69 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  fileSize);.     
167e0 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
167f0 54 45 5f 4f 4b 20 7c 7c 20 66 69 6c 65 53 69 7a  TE_OK || fileSiz
16800 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72 2d 3e  e>=pgno*pPager->
16810 70 61 67 65 53 69 7a 65 20 29 7b 0a 09 20 20 2f  pageSize ){..  /
16820 2a 20 41 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  * An IO error oc
16830 63 75 72 65 64 20 69 6e 20 6f 6e 65 20 6f 66 20  cured in one of 
16840 74 68 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  the the sqlite3O
16850 73 53 65 65 6b 28 29 20 6f 72 0a 20 20 20 20 20  sSeek() or.     
16860 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f       ** sqlite3O
16870 73 52 65 61 64 28 29 20 63 61 6c 6c 73 20 61 62  sRead() calls ab
16880 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ove. */.        
16890 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
168a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
168b0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
168c0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
168d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
168e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
168f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16900 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64   clear_simulated
16910 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20  _io_error();.   
16920 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
16930 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16940 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
16950 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
16960 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
16970 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52         TEST_INCR
16980 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
16990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
169a0 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20      /* Link the 
169b0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
169c0 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  ge hash table */
169d0 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68  .    h = pager_h
169e0 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ash(pgno);.    p
169f0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
16a00 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
16a10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
16a20 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
16a30 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
16a40 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
16a50 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
16a60 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
16a70 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
16a80 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
16a90 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
16aa0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
16ab0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
16ac0 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
16ad0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
16ae0 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
16af0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
16b00 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
16b10 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20   is in the page 
16b20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54 45  cache. */.    TE
16b30 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ST_INCR(pPager->
16b40 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65 5f  nHit);.    page_
16b50 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
16b60 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f  *ppPage = PGHDR_
16b70 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
16b80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
16ba0 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
16bb0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
16bc0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
16bd0 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
16be0 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
16bf0 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
16c00 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
16c10 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
16c20 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16c30 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
16c40 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
16c50 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54  3pager_get().  T
16c60 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
16c70 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
16c80 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
16c90 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20  3pager_get() is 
16ca0 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
16cb0 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
16cc0 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
16cd0 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
16ce0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
16cf0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
16d00 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
16d10 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
16d20 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
16d30 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
16d40 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
16d50 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
16d60 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
16d70 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75  lite3pager_looku
16d80 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
16d90 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
16da0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
16db0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
16dc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
16dd0 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  o!=0 );.  if( pP
16de0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
16df0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
16e00 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
16e10 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16e20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
16e30 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16e40 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
16e50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16e60 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
16e70 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
16e80 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
16e90 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
16ea0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
16eb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
16ec0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
16ed0 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
16ee0 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
16ef0 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
16f00 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
16f10 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
16f20 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
16f30 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
16f40 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
16f50 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
16f60 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16f70 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
16f80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
16f90 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70  er_unref(void *p
16fa0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
16fb0 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65  pPg;..  /* Decre
16fc0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
16fd0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  ce count for thi
16fe0 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50  s page.  */.  pP
16ff0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
17000 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  R(pData);.  asse
17010 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
17020 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
17030 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
17040 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
17050 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
17060 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
17070 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
17080 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
17090 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
170a0 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
170b0 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
170c0 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
170d0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
170e0 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
170f0 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
17100 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
17110 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
17120 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
17130 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
17140 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
17150 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
17160 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
17170 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
17180 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
17190 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
171a0 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
171b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
171c0 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
171d0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
171e0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70  needSync==0 && p
171f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
17200 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ced==0 ){.      
17210 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
17220 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20  nced = pPg;.    
17230 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
17240 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
17250 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
17260 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
17270 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17280 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
17290 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
172a0 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
172b0 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
172c0 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
172d0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
172e0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
172f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
17300 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
17310 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
17320 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
17330 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
17340 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
17350 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
17360 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
17370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
17390 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
173a0 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
173b0 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
173c0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
173d0 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
173e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
173f0 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
17400 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17410 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
17420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
17430 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
17440 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
17450 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
17460 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
17470 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
17480 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
17490 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
174a0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
174b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
174c0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
174d0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
174e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
174f0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
17500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
17510 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17520 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
17530 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
17540 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
17550 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
17560 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
17570 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
17580 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  unt(pPager);.  p
17590 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
175a0 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
175b0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
175c0 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
175d0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
175e0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  al==0 ){.    rc 
175f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
17600 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
17610 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
17620 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
17630 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
17640 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ve(pPager->zJour
17650 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
17660 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 20 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70      pPager->temp
17690 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  File);.  pPager-
176a0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
176b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
176c0 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
176d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
176e0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
176f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
17700 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
17710 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
17720 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
17730 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  llSync(pPager->j
17740 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
17750 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  _fsync);.  sqlit
17760 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
17770 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
17780 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
17790 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  .  sqlite3OsOpen
177a0 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72  Directory(pPager
177b0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  ->jfd, pPager->z
177c0 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50  Directory);.  pP
177d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
177e0 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
177f0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
17800 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
17810 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
17820 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
17830 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
17840 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
17850 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
17860 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
17870 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17880 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
17890 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
178a0 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
178b0 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
178c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
178d0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
178e0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
178f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17900 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
17910 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17920 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
17930 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28  ager_stmt_begin(
17940 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
17950 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17960 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
17970 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
17980 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
17990 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
179a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
179b0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
179c0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
179d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
179e0 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
179f0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
17a00 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
17a10 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
17a20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
17a30 6e 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  nal = 0;.  if( r
17a40 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
17a50 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
17a60 73 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29  s was a malloc()
17a70 20 66 61 69 6c 75 72 65 2c 20 74 68 65 6e 20 77   failure, then w
17a80 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c  e will not be cl
17a90 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65 72 0a  osing the pager.
17aa0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20      ** file. So 
17ab0 64 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e  delete any journ
17ac0 61 6c 20 66 69 6c 65 20 77 65 20 6d 61 79 20 68  al file we may h
17ad0 61 76 65 20 6a 75 73 74 20 63 72 65 61 74 65 64  ave just created
17ae0 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
17af0 20 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 20 77   ** the system w
17b00 69 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73 65 64  ill get confused
17b10 2c 20 77 65 20 68 61 76 65 20 61 20 72 65 61 64  , we have a read
17b20 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c  -lock on the fil
17b30 65 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d  e and a.    ** m
17b40 79 73 74 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61  ysterious journa
17b50 6c 20 68 61 73 20 61 70 70 65 61 72 65 64 20 69  l has appeared i
17b60 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
17b70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
17b80 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
17b90 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
17ba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
17bb0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
17bc0 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
17bd0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
17be0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
17bf0 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  OCK;.  }.  retur
17c00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
17c10 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
17c20 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
17c30 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
17c40 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
17c50 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
17c60 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
17c70 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
17c80 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
17c90 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  t() is called..*
17ca0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
17cb0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69  ger_rollback() i
17cc0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
17cd0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63    sqlite3pager_c
17ce0 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
17cf0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
17d00 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69  3pager_unref() i
17d10 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
17d20 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
17d30 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
17d40 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
17d50 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
17d60 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
17d70 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f   any open page o
17d80 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
17d90 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67  e file.  Nothing
17da0 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74   changes about t
17db0 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20  he page - it is 
17dc0 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a  used merely to.*
17dd0 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e  * acquire a poin
17de0 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
17df0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
17e00 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65  s proof that the
17e10 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  re is.** already
17e20 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
17e30 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
17e40 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70  .** The second p
17e50 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
17e60 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  es how much spac
17e70 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  e in bytes to re
17e80 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d  serve for a.** m
17e90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
17ea0 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73  le-name at the s
17eb0 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
17ec0 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63  nal when it is c
17ed0 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  reated..**.** A 
17ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
17ef0 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
17f00 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
17f10 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d  y file.  For tem
17f20 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c  porary.** files,
17f30 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
17f40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
17f50 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
17f60 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  il there is an.*
17f70 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  * actual need to
17f80 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
17f90 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
17fa0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
17fb0 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64  already reserved
17fc0 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68   for writing, th
17fd0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
17fe0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
17ff0 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
18000 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74  go ahead and get
18010 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
18020 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ck on the file.*
18030 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e  * immediately in
18040 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67  stead of waiting
18050 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f   until we try to
18060 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
18070 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67  .  The.** exFlag
18080 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61   is ignored if a
18090 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
180a0 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
180b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
180c0 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a  ger_begin(void *
180d0 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46 6c 61  pData, int exFla
180e0 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
180f0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
18100 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
18110 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
18120 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
18130 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18140 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
18150 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
18160 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
18170 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
18180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
18190 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
181a0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
181b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
181c0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
181d0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
181e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
181f0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
18200 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
18210 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
18220 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
18230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
18240 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
18250 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
18260 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
18270 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18290 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
182a0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
182b0 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
182c0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
182d0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
182e0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
182f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
18300 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18310 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
18320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18330 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
18350 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
18360 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  e = 0;.      TRA
18370 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE2("TRANSACTION
18380 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18390 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
183a0 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  if( pPager->useJ
183b0 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65  ournal && !pPage
183c0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
183d0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
183e0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
183f0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
18400 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18420 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
18430 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20   as writeable.  
18440 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
18450 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
18460 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69  rnal .** if it i
18470 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
18480 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ady.  This routi
18490 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
184a0 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a  d before making.
184b0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  ** changes to a 
184c0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
184d0 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
184e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
184f0 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65  d, the pager cre
18500 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f  ates a new.** jo
18510 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72  urnal and acquir
18520 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  es a RESERVED lo
18530 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
18540 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45  se.  If the RESE
18550 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75  RVED.** lock cou
18560 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72  ld not be acquir
18570 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
18580 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
18590 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61  BUSY.  The.** ca
185a0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75  lling routine mu
185b0 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61  st check for tha
185c0 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61  t return value a
185d0 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
185e0 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61  t to.** change a
185f0 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74  ny page data unt
18600 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  il this routine 
18610 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
18620 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
18630 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75  journal file cou
18640 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ld not be writte
18650 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69  n because the di
18660 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74  sk is full,.** t
18670 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
18680 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
18690 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e  FULL and does an
186a0 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62   immediate rollb
186b0 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73  ack..** All subs
186c0 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74  equent write att
186d0 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72  empts also retur
186e0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e  n SQLITE_FULL un
186f0 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  til there.** is 
18700 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
18710 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20  3pager_commit() 
18720 6f 72 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  or sqlite3pager_
18730 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a  rollback() to.**
18740 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73   reset..*/.int s
18750 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
18760 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  e(void *pData){.
18770 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
18780 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
18790 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
187a0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
187b0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
187c0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
187d0 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
187e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
187f0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a  er->errCode ){ .
18800 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
18810 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
18820 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
18830 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
18840 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
18850 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
18860 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
18870 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
18880 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
18890 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
188a0 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
188b0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
188c0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
188d0 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
188e0 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
188f0 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
18900 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69  ..  */.  pPg->di
18910 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  rty = 1;.  if( p
18920 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
18930 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c   (pPg->inStmt ||
18940 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
18950 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
18960 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
18970 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
18980 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
18990 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
189a0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
189b0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
189c0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
189d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
189e0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
189f0 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
18a00 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
18a10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
18a20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
18a30 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
18a40 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
18a50 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
18a60 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
18a70 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
18a80 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
18a90 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
18aa0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
18ab0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
18ac0 67 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61 2c  ger_begin(pData,
18ad0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
18ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18af0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18b00 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18b10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
18b20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
18b30 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
18b40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
18b50 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
18b60 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
18b70 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
18b80 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
18b90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18ba0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
18bb0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
18bc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
18bd0 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
18be0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
18bf0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
18c00 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
18c10 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
18c20 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
18c30 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
18c40 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
18c50 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
18c60 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
18c70 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
18c80 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
18c90 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
18ca0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
18cb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
18cc0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
18cd0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
18ce0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18cf0 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
18d00 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a  && (pPager->useJ
18d10 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29  ournal || MEMDB)
18d20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
18d30 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
18d40 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
18d50 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ze ){.        in
18d60 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  t szPg;.        
18d70 75 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20 20  u32 saved;.     
18d80 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
18d90 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74            PgHist
18da0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
18db0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
18dc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
18dd0 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e     TRACE3("JOURN
18de0 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
18df0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18e00 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
18e10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
18e20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30   pHist->pOrig==0
18e30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48   );.          pH
18e40 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c  ist->pOrig = sql
18e50 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
18e60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
18e70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18e80 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
18e90 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
18ea0 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
18eb0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
18ec0 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
18ed0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
18ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
18ef0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  e{.          u32
18f00 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
18f10 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
18f20 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
18f30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
18f40 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
18f50 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
18f60 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
18f70 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
18f80 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
18f90 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ifies.          
18fa0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
18fb0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
18fc0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
18fd0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
18fe0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
18ff0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
19000 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
19010 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
19020 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
19030 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
19040 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61  pPg->pgno, pData
19050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  );.          sav
19060 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44  ed = *(u32*)PGHD
19070 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
19080 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
19090 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63     store32bits(c
190a0 6b 73 75 6d 2c 20 70 50 67 2c 20 70 50 61 67 65  ksum, pPg, pPage
190b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
190c0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
190d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
190e0 38 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  8;.          sto
190f0 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
19100 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 0a 20  no, pPg, -4);.. 
19110 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
19120 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
19130 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61  ger->jfd, &((cha
19140 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73  r*)pData)[-4], s
19150 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  zPg);.          
19160 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19170 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
19180 20 20 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f        TRACE4("JO
19190 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
191a0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
191b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
191c0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
191d0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
191e0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
191f0 20 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70           CODEC(p
19200 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
19210 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
19220 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47         *(u32*)PG
19230 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
19240 2c 20 70 50 61 67 65 72 29 20 3d 20 73 61 76 65  , pPager) = save
19250 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72  d;...  /* An err
19260 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
19270 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
19280 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
19290 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72  .          ** tr
192a0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
192b0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
192c0 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
192d0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
192e0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
192f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19300 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19310 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
19320 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ..          pPag
19330 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
19340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
19350 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
19360 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
19370 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
19380 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
19390 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
193a0 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
193b0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
193c0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
193d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
193e0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
193f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19400 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
19410 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
19420 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
19430 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ;.            pa
19440 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
19450 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
19460 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
19470 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19480 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
19490 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f  nc = !pPager->jo
194a0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
194b0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
194c0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 34 28  .        TRACE4(
194d0 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
194e0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
194f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19500 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
19510 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
19520 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
19530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19540 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
19550 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19560 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
19570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
19580 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
19590 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
195a0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
195b0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
195c0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
195d0 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
195e0 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
195f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
19600 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
19610 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
19620 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
19630 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
19640 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
19650 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
19660 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
19670 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
19680 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
19690 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
196a0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
196b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
196c0 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
196d0 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
196e0 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
196f0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
19700 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19710 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
19720 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
19730 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
19740 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
19750 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
19760 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
19770 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
19780 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
19790 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
197a0 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
197b0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
197c0 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
197d0 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
197e0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
197f0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
19800 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
19810 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
19820 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
19830 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
19840 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
19850 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19860 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d     TRACE3("STMT-
19870 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
19880 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
19890 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
198a0 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
198b0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32  .        store32
198c0 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20  bits(pPg->pgno, 
198d0 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20  pPg, -4);.      
198e0 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
198f0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
19900 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , 7);.        rc
19910 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
19920 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 28  e(pPager->stfd,(
19930 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c  (char*)pData)-4,
19940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19970 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  +4);.        TRA
19980 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
19990 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
199a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
199b0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
199c0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
199d0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
199e0 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
199f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19a00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
19a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19a20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
19a30 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
19a40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
19a50 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
19a60 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
19a70 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
19a80 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
19a90 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
19aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19ab0 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
19ac0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
19ad0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
19ae0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
19af0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
19b00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
19b10 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
19b20 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
19b30 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
19b40 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
19b50 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
19b60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
19b70 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
19b80 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
19b90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
19ba0 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
19bb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19bc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
19bd0 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
19be0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
19bf0 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
19c00 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
19c10 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  o sqlite3pager_w
19c20 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
19c30 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
19c40 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
19c50 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
19c60 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
19c70 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
19c80 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
19c90 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74  ite3pager_iswrit
19ca0 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74  eable(void *pDat
19cb0 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
19cc0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
19cd0 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
19ce0 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
19cf0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
19d00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
19d10 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UM./*.** Replace
19d20 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
19d30 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69  a single page wi
19d40 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  th the informati
19d50 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a  on in the third.
19d60 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
19d70 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
19d80 5f 6f 76 65 72 77 72 69 74 65 28 50 61 67 65 72  _overwrite(Pager
19d90 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
19da0 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  gno, void *pData
19db0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65  ){.  void *pPage
19dc0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
19dd0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
19de0 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  _get(pPager, pgn
19df0 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66  o, &pPage);.  if
19e00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19e10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
19e20 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
19e30 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
19e40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19e50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
19e60 67 65 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  ge, pData, pPage
19e70 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
19e80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70    }.    sqlite3p
19e90 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
19ea0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19eb0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
19ec0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
19ed0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
19ee0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
19ef0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
19f00 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
19f10 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
19f20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62  on page "pgno" b
19f30 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
19f40 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
19f50 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
19f60 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
19f70 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  ty..**.** The ov
19f80 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
19f90 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
19fa0 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
19fb0 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
19fc0 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
19fd0 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
19fe0 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
19ff0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1a000 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
1a010 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
1a020 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
1a030 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
1a040 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
1a050 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
1a060 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
1a070 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
1a080 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
1a090 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
1a0a0 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
1a0b0 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
1a0c0 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
1a0d0 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
1a0e0 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
1a0f0 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
1a100 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1a110 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
1a120 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
1a130 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
1a140 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1a150 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  o sqlite3pager_d
1a160 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66  ont_rollback() f
1a170 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  or the same page
1a180 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66  .** will thereaf
1a190 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20  ter be ignored. 
1a1a0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
1a1b0 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72  ry to avoid a pr
1a1c0 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61  oblem.** where a
1a1d0 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20   page with data 
1a1e0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
1a1f0 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
1a200 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61  one part of.** a
1a210 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
1a220 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  n removed from t
1a230 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1a240 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a  ng a later part.
1a250 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74  ** of the same t
1a260 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72  ransaction and r
1a270 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f  eused for some o
1a280 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57  ther purpose.  W
1a290 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72  hen it.** is fir
1a2a0 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  st added to the 
1a2b0 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72  freelist, this r
1a2c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1a2d0 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a  .  When reused,.
1a2e0 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c  ** the dont_roll
1a2f0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69  back() routine i
1a300 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62  s called.  But b
1a310 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
1a320 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74  contains.** crit
1a330 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74  ical data, we st
1a340 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
1a350 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c  ure it gets roll
1a360 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
1a370 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f  .** of the dont_
1a380 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  rollback() call.
1a390 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a3a0 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65  pager_dont_write
1a3b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1a3c0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1a3d0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
1a3e0 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
1a3f0 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
1a400 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1a410 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77  gno);.  pPg->alw
1a420 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
1a430 0a 20 20 69 66 28 20 70 50 67 20 26 26 20 70 50  .  if( pPg && pP
1a440 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61  g->dirty && !pPa
1a450 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1a460 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
1a470 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
1a480 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
1a490 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
1a4a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
1a4b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
1a4c0 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
1a4d0 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
1a4e0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
1a4f0 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
1a500 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
1a510 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1a520 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
1a530 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
1a540 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
1a550 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
1a560 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
1a570 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
1a580 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
1a590 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
1a5a0 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
1a5b0 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
1a5c0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
1a5d0 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
1a5e0 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
1a5f0 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
1a600 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
1a610 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1a620 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
1a630 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
1a640 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
1a650 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
1a660 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
1a670 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
1a680 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
1a690 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
1a6a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
1a6b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43  else{.      TRAC
1a6c0 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
1a6d0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
1a6e0 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70   pgno, PAGERID(p
1a6f0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70  Pager));.      p
1a700 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  Pg->dirty = 0;.#
1a710 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1a720 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70  CK_PAGES.      p
1a730 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
1a740 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1a750 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  g);.#endif.    }
1a760 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
1a770 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1a780 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1a790 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
1a7a0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
1a7b0 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
1a7c0 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
1a7d0 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
1a7e0 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
1a7f0 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
1a800 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
1a810 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
1a820 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
1a830 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
1a840 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
1a850 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
1a860 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
1a870 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  k(void *pData){.
1a880 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
1a890 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
1a8a0 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
1a8b0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1a8c0 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  er;..  if( pPage
1a8d0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1a8e0 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61  EXCLUSIVE || pPa
1a8f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1a900 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1a910 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
1a920 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
1a930 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1a940 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74  k || MEMDB ) ret
1a950 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d  urn;.  if( !pPg-
1a960 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
1a970 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
1a980 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1a990 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
1a9a0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1a9b0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70  rnal!=0 );.    p
1a9c0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1a9d0 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
1a9e0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1a9f0 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a  7);.    pPg->inJ
1aa00 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
1aa10 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1aa20 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70  InUse ){.      p
1aa30 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
1aa40 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1aa50 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1aa60 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
1aa70 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1aa80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
1aa90 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
1aaa0 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
1aab0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
1aac0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1aad0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1aae0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
1aaf0 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
1ab00 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
1ab10 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
1ab20 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1ab30 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1ab40 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
1ab50 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1ab60 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
1ab70 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
1ab80 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  tmt!=0 );.    pP
1ab90 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1aba0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1abb0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1abc0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
1abd0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
1abe0 20 20 7d 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20    }.}...#ifndef 
1abf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
1ac00 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  RYDB./*.** Clear
1ac10 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f   a PgHistory blo
1ac20 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
1ac30 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50  d clearHistory(P
1ac40 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29  gHistory *pHist)
1ac50 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  {.  sqliteFree(p
1ac60 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20  Hist->pOrig);.  
1ac70 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
1ac80 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73  ->pStmt);.  pHis
1ac90 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20  t->pOrig = 0;.  
1aca0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
1acb0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
1acc0 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78  e clearHistory(x
1acd0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1ace0 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67  Commit all chang
1acf0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1ad00 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  se and release t
1ad10 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a  he write lock..*
1ad20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d  *.** If the comm
1ad30 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  it fails for any
1ad40 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62   reason, a rollb
1ad50 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d  ack attempt is m
1ad60 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ade.** and an er
1ad70 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1ad80 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f  rned.  If the co
1ad90 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c  mmit worked, SQL
1ada0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
1adb0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
1adc0 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
1add0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
1ade0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
1adf0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
1ae00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ae10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1ae20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1ae30 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1ae40 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
1ae50 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
1ae60 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1ae70 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28  R;.  }.  TRACE2(
1ae80 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
1ae90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1aea0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1aeb0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1aec0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1aed0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1aee0 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
1aef0 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
1af00 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
1af10 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
1af20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
1af30 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1af40 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
1af50 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
1af60 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1af70 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
1af80 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
1af90 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
1afa0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
1afb0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1afc0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
1afd0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
1afe0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
1aff0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
1b000 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1b010 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1b020 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
1b030 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
1b040 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
1b050 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
1b060 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
1b070 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
1b080 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
1b090 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67  .#endif.    pPag
1b0a0 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
1b0b0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1b0c0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
1b0d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1b0e0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1b0f0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1b100 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  che==0 ){.    /*
1b110 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74   Exit early (wit
1b120 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74  hout doing the t
1b130 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71  ime-consuming sq
1b140 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61  lite3OsSync() ca
1b150 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74  lls).    ** if t
1b160 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
1b170 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  o changes to the
1b180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b190 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1b1a0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d  Pager->needSync=
1b1b0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
1b1c0 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
1b1d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1b1e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
1b1f0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
1b200 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1b210 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b220 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
1b230 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
1b240 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
1b250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b260 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
1b270 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
1b280 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1b290 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
1b2a0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1b2b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
1b2c0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
1b2d0 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
1b2e0 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
1b2f0 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
1b300 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
1b310 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
1b320 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
1b330 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
1b340 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
1b350 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
1b360 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b370 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
1b380 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
1b390 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
1b3a0 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
1b3b0 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
1b3c0 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
1b3d0 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
1b3e0 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
1b3f0 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
1b400 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
1b410 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1b420 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
1b430 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
1b440 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
1b450 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
1b460 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
1b470 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
1b480 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
1b490 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
1b4a0 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
1b4b0 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
1b4c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1b4d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1b4e0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
1b4f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1b500 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43    int rc;.  TRAC
1b510 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
1b520 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1b530 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1b540 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  B ){.    PgHdr *
1b550 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
1b560 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
1b570 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
1b580 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1b590 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Hist;.      asse
1b5a0 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f  rt( !p->alwaysRo
1b5b0 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
1b5c0 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b  if( !p->dirty ){
1b5d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1b5e0 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1b5f0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1b600 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
1b610 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1b620 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
1b630 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
1b640 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
1b650 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
1b660 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
1b670 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
1b680 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1b690 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1b6a0 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
1b6b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1b6c0 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
1b6d0 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
1b6e0 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
1b6f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ize);.        TR
1b700 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50  ACE3("ROLLBACK-P
1b710 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  AGE %d of %d\n",
1b720 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
1b730 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1b740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b750 20 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64   TRACE3("PAGE %d
1b760 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
1b770 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
1b780 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1b790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
1b7a0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
1b7b0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
1b7c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
1b7d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
1b7e0 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20      p->inStmt = 
1b7f0 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  0;.      p->pPre
1b800 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74  vStmt = p->pNext
1b810 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Stmt = 0;..     
1b820 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
1b830 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
1b840 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1b850 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
1b860 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  A(p), pPager->pa
1b870 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
1b880 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  .      .    }.  
1b890 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1b8a0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1b8b0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1b8c0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
1b8d0 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1b8e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1b8f0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1b900 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1b910 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1b920 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
1b930 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b940 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1b950 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
1b960 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b970 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1b980 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1b990 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
1b9a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1b9b0 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
1b9c0 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
1b9d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
1b9e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1b9f0 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
1ba00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1ba10 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
1ba20 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
1ba30 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1ba40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1ba50 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1ba60 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
1ba70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1ba80 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
1ba90 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
1baa0 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
1bab0 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70  r_reload_cache(p
1bac0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32 20  Pager);.    rc2 
1bad0 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
1bae0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
1baf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bb00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1bb10 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   rc2;.    }.  }e
1bb20 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
1bb30 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
1bb40 67 65 72 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ger);.  }.  pPag
1bb50 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
1bb60 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
1bb70 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
1bb80 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
1bb90 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
1bba0 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
1bbb0 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
1bbc0 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
1bbd0 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
1bbe0 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
1bbf0 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e   .  ** persisten
1bc00 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  t..  */.  return
1bc10 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
1bc20 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ger, rc);.}../*.
1bc30 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
1bc40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1bc50 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65  ile is opened re
1bc60 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ad-only.  Return
1bc70 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65   FALSE.** if the
1bc80 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e   database is (in
1bc90 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c   theory) writabl
1bca0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1bcb0 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c  3pager_isreadonl
1bcc0 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
1bcd0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1bce0 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
1bcf0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1bd00 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
1bd10 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
1bd20 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
1bd30 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73   *sqlite3pager_s
1bd40 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
1bd50 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
1bd60 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
1bd70 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a  = pPager->nRef;.
1bd80 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d    a[1] = pPager-
1bd90 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d  >nPage;.  a[2] =
1bda0 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b   pPager->mxPage;
1bdb0 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
1bdc0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d  ->dbSize;.  a[4]
1bdd0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
1bde0 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
1bdf0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 23 69 66 64  r->errCode;.#ifd
1be00 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1be10 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
1be20 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
1be30 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
1be40 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[8] = pPager->n
1be50 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70  Ovfl;.  a[9] = p
1be60 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
1be70 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
1be80 6e 57 72 69 74 65 3b 0a 23 65 6e 64 69 66 0a 20  nWrite;.#endif. 
1be90 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a   return a;.}../*
1bea0 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
1beb0 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
1bec0 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
1bed0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1bee0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
1bef0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1bf00 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
1bf10 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
1bf20 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1bf30 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
1bf40 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1bf50 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
1bf60 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
1bf70 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
1bf80 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
1bf90 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
1bfa0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
1bfb0 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70  t_begin(Pager *p
1bfc0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1bfd0 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
1bfe0 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
1bff0 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  IZE];.  assert( 
1c000 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55  !pPager->stmtInU
1c010 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  se );.  assert( 
1c020 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
1c030 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53  0 );.  TRACE2("S
1c040 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c  TMT-BEGIN %d\n",
1c050 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c060 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
1c070 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
1c080 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20  mtInUse = 1;.   
1c090 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
1c0a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1c0b0 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ze;.    return S
1c0c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1c0d0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
1c0e0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
1c0f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1c100 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65  open = 1;.    re
1c110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c120 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1c130 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1c140 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  n );.  pPager->a
1c150 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  InStmt = sqliteM
1c160 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
1c170 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
1c180 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
1c190 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Stmt==0 ){.    /
1c1a0 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  * sqlite3OsLock(
1c1b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
1c1c0 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20  ED_LOCK); */.   
1c1d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1c1e0 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  OMEM;.  }.#ifnde
1c1f0 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20  f NDEBUG.  rc = 
1c200 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1c210 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1c220 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
1c230 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
1c240 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
1c250 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28  ailed;.  assert(
1c260 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
1c270 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ze == pPager->jo
1c280 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64  urnalOff );.#end
1c290 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  if.  pPager->stm
1c2a0 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
1c2b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
1c2c0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1c2d0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1c2e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
1c2f0 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  HdrOff = 0;.  pP
1c300 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20  ager->stmtCksum 
1c310 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
1c320 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  nit;.  if( !pPag
1c330 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
1c340 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c350 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
1c360 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73  Temp, &pPager->s
1c370 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tfd);.    if( rc
1c380 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
1c390 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70  in_failed;.    p
1c3a0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
1c3b0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
1c3c0 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
1c3d0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
1c3e0 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
1c3f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c400 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
1c410 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
1c420 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->aInStmt ){.  
1c430 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
1c440 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20  ger->aInStmt);. 
1c450 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1c460 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
1c470 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c480 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
1c490 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
1c4a0 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
1c4b0 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
1c4c0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
1c4d0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1c4e0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c  .    PgHdr *pPg,
1c4f0 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41   *pNext;.    TRA
1c500 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54  CE2("STMT-COMMIT
1c510 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1c520 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
1c530 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
1c540 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
1c550 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
1c560 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
1c570 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
1c580 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
1c590 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  /.      sqliteFr
1c5a0 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ee( pPager->aInS
1c5b0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61  tmt );.      pPa
1c5c0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
1c5d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1c5e0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
1c5f0 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  t; pPg; pPg=pNex
1c600 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
1c610 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
1c620 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c630 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20  pPg->inStmt );. 
1c640 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
1c650 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1c660 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
1c670 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
1c680 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
1c690 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
1c6a0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1c6b0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1c6c0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1c6d0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
1c6e0 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
1c6f0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1c700 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1c710 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1c720 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
1c730 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
1c740 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
1c750 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
1c760 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
1c770 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
1c780 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1c790 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
1c7a0 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
1c7b0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1c7c0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c  e3pager_stmt_rol
1c7d0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
1c7e0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1c7f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1c800 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54  mtInUse ){.    T
1c810 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
1c820 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
1c830 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1c840 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1c850 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
1c860 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
1c870 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
1c880 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
1c890 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
1c8a0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1c8b0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1c8c0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1c8d0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1c8e0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1c8f0 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
1c900 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1c910 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
1c920 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c930 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1c940 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
1c950 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
1c960 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
1c970 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c980 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1c990 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1c9a0 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
1c9b0 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1c9c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1c9d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c9e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c9f0 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
1ca00 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1ca10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1ca20 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
1ca30 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
1ca40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1ca50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ca60 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
1ca70 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
1ca80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ca90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
1caa0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
1cab0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1cac0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1cad0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c  sqlite3pager_fil
1cae0 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
1caf0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1cb00 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1cb10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1cb20 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
1cb30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1cb40 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
1cb50 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
1cb60 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20  r_dirname(Pager 
1cb70 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1cb80 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
1cb90 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
1cba0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
1cbb0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
1cbc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
1cbd0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1cbe0 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61  ite3pager_journa
1cbf0 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
1cc00 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1cc10 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
1cc20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1cc30 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
1cc40 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
1cc50 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
1cc60 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
1cc70 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
1cc80 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
1cc90 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
1cca0 71 6c 69 74 65 33 70 61 67 65 72 5f 6e 6f 73 79  qlite3pager_nosy
1ccb0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
1ccc0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1ccd0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f  er->noSync;.}../
1cce0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
1ccf0 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
1cd00 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
1cd10 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63  3pager_set_codec
1cd20 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1cd30 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  r,.  void (*xCod
1cd40 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
1cd50 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
1cd60 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
1cd70 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
1cd80 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
1cd90 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
1cda0 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f   pCodecArg;.}../
1cdb0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1cdc0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
1cdd0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
1cde0 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
1cdf0 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
1ce00 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
1ce10 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
1ce20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1ce30 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1ce40 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
1ce50 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64  *pPager){.  void
1ce60 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72   *pPage;.  PgHdr
1ce70 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20   *pPgHdr;.  u32 
1ce80 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1ce90 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1cea0 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
1ceb0 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
1cec0 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ing. */.  rc = s
1ced0 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1cee0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67  pPager, 1, &pPag
1cef0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
1cf00 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1cf10 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
1cf20 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
1cf30 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1cf40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1cf50 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65  urn rc;..  /* Re
1cf60 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ad the current v
1cf70 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e  alue at byte 24.
1cf80 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44   */.  pPgHdr = D
1cf90 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61  ATA_TO_PGHDR(pPa
1cfa0 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f  ge);.  change_co
1cfb0 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65  unter = retrieve
1cfc0 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32  32bits(pPgHdr, 2
1cfd0 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  4);..  /* Increm
1cfe0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1cff0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1d000 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1d010 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1d020 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73  e_counter++;.  s
1d030 74 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e 67  tore32bits(chang
1d040 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48 64  e_counter, pPgHd
1d050 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65  r, 24);..  /* Re
1d060 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
1d070 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73  eference. */.  s
1d080 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
1d090 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  f(pPage);.  retu
1d0a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d0b0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1d0c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1d0d0 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
1d0e0 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
1d0f0 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
1d100 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
1d110 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1d120 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
1d130 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
1d140 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
1d150 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
1d160 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
1d170 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
1d180 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
1d190 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
1d1a0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1d1b0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1d1c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
1d1d0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
1d1e0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
1d1f0 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1d200 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
1d210 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d220 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1d230 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
1d240 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
1d250 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
1d260 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
1d270 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
1d280 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1d290 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
1d2a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1d2b0 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
1d2c0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1d2d0 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
1d2e0 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
1d2f0 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
1d300 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
1d310 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
1d320 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63  e3pager_sync() c
1d330 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  all..**.** If pa
1d340 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69  rameter nTrunc i
1d350 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1d360 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
1d370 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  is truncated to.
1d380 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20  ** nTrunc pages 
1d390 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79  (this is used by
1d3a0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1d3b0 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20  abases)..*/.int 
1d3c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
1d3d0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  c(Pager *pPager,
1d3e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1d3f0 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e  ster, Pgno nTrun
1d400 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
1d410 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52 41  QLITE_OK;..  TRA
1d420 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59  CE4("DATABASE SY
1d430 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
1d440 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64  ter=%s nTrunc=%d
1d450 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
1d460 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1d470 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b  Master, nTrunc);
1d480 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1d490 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
1d4a0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
1d4b0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
1d4c0 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
1d4d0 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
1d4e0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
1d4f0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
1d500 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
1d510 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1d520 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45  ER_SYNCED && !ME
1d530 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
1d540 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
1d550 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
1d560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d570 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1d580 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73  .    /* If a mas
1d590 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1d5a0 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
1d5b0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1d5c0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  o the.    ** jou
1d5d0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
1d5e0 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  no sync is requi
1d5f0 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e  red. This happen
1d600 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20  s when it is.   
1d610 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65   ** written, the
1d620 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61  n the process fa
1d630 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66  ils to upgrade f
1d640 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74  rom a RESERVED t
1d650 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  o an.    ** EXCL
1d660 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20  USIVE lock. The 
1d670 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72  next time the pr
1d680 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63  ocess tries to c
1d690 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  ommit the.    **
1d6a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
1d6b0 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68   m-j name will h
1d6c0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1d6d0 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
1d6e0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1d6f0 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20  ->setMaster ){. 
1d700 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1d710 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1d720 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
1d730 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d740 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1d750 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51  exit;.#ifndef SQ
1d760 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1d770 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e  CUUM.      if( n
1d780 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1d790 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
1d7a0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
1d7b0 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
1d7c0 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
1d7d0 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20  ll pages.       
1d7e0 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
1d7f0 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
1d800 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
1d810 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
1d820 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1d830 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
1d840 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  .        Pgno i;
1d850 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70  .        void *p
1d860 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Page;.        in
1d870 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  t iSkip = PAGER_
1d880 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
1d890 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d  .        for( i=
1d8a0 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61  nTrunc+1; i<=pPa
1d8b0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1d8c0 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
1d8d0 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e    if( !(pPager->
1d8e0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20  aInJournal[i/8] 
1d8f0 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26  & (1<<(i&7))) &&
1d900 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
1d910 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1d920 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1d930 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65  Pager, i, &pPage
1d940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1d950 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d960 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1d970 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
1d980 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1d990 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
1d9a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1d9b0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
1d9c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1d9d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d9e0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1d9f0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1da00 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  }.        } .   
1da10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1da20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
1da30 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1da40 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1da50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1da60 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1da70 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  exit;.      rc =
1da80 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1da90 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1daa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1dab0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1dac0 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
1dad0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1dae0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54  ACUUM.    if( nT
1daf0 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
1db00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1db10 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1db20 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20  er, nTrunc);.   
1db30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1db40 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1db50 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  _exit;.    }.#en
1db60 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
1db70 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
1db80 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1db90 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50  e file */.    pP
1dba0 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
1dbb0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
1dbc0 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  ager);.    rc = 
1dbd0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1dbe0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
1dbf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dc00 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1dc10 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  t;..    /* Sync 
1dc20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dc30 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
1dc40 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1dc50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1dc60 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1dc70 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ->fd, 0);.    }.
1dc80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
1dc90 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
1dca0 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69  D;.  }..sync_exi
1dcb0 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
1dcc0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1dcd0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1dce0 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  M./*.** Move the
1dcf0 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64   page identified
1dd00 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f 63   by pData to loc
1dd10 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68  ation pgno in th
1dd20 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54  e file. .**.** T
1dd30 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
1dd40 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1dd50 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 70  e current page p
1dd60 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74 20  gno. If current 
1dd70 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20  page.** pgno is 
1dd80 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74  not already in t
1dd90 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1dda0 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 77  nal, it is not w
1ddb0 72 69 74 74 65 6e 20 74 68 65 72 65 20 62 79 0a  ritten there by.
1ddc0 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ** by this routi
1ddd0 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70  ne. The same app
1dde0 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  lies to the page
1ddf0 20 70 44 61 74 61 20 72 65 66 65 72 73 20 74 6f   pData refers to
1de00 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20   on entry to.** 
1de10 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
1de20 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
1de30 6f 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  o the page refer
1de40 65 64 20 74 6f 20 62 79 20 70 44 61 74 61 20 72  ed to by pData r
1de50 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
1de60 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
1de70 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
1de80 64 20 77 69 74 68 20 70 61 67 65 20 70 44 61 74  d with page pDat
1de90 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f  a (i.e. data sto
1dea0 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72  red in the nExtr
1deb0 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63  a bytes.** alloc
1dec0 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
1ded0 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65  the page) is the
1dee0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1def0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  of the caller..*
1df00 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69  *.** A transacti
1df10 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76  on must be activ
1df20 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
1df30 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49  ine is called. I
1df40 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20  t used to be.** 
1df50 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20  required that a 
1df60 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1df70 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63  ction was not ac
1df80 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72  tive, but this r
1df90 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61  estriction.** ha
1dfa0 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28  s been removed (
1dfb0 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65  CREATE INDEX nee
1dfc0 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67  ds to move a pag
1dfd0 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65  e when a stateme
1dfe0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
1dff0 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f  n is active)..*/
1e000 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1e010 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65 72  r_movepage(Pager
1e020 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 2a   *pPager, void *
1e030 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e 6f  pData, Pgno pgno
1e040 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1e050 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1e060 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72 20  pData);.  PgHdr 
1e070 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20  *pPgOld; .  int 
1e080 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  h;.  Pgno needSy
1e090 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  ncPgno = 0;..  a
1e0a0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1e0b0 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 35 28  >0 );..  TRACE5(
1e0c0 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64  "MOVE %d page %d
1e0d0 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d   (needSync=%d) m
1e0e0 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a  oves to %d\n", .
1e0f0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1e100 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1e110 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c  , pPg->needSync,
1e120 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 70   pgno);..  if( p
1e130 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
1e140 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
1e150 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
1e160 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1e170 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
1e180 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
1e190 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
1e1a0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1e1b0 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
1e1c0 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
1e1d0 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20  it's hash-chain 
1e1e0 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
1e1f0 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
1e200 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1e210 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
1e220 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
1e230 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
1e240 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
1e250 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
1e260 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
1e270 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
1e280 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
1e290 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
1e2a0 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
1e2b0 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
1e2c0 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
1e2d0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
1e2e0 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
1e2f0 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70   */.  pPgOld = p
1e300 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1e310 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
1e320 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61   pPgOld ){.    a
1e330 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e  ssert( pPgOld->n
1e340 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e  Ref==0 );.    un
1e350 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
1e360 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20  ager, pPgOld);. 
1e370 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69 72 74 79     pPgOld->dirty
1e380 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1e390 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29  gOld->needSync )
1e3a0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1e3b0 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgOld->inJourna
1e3c0 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  l );.      pPg->
1e3d0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1e3e0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1e3f0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  nc = 1;.      as
1e400 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1e410 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a  edSync );.    }.
1e420 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65    }..  /* Change
1e430 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1e440 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73   for pPg and ins
1e450 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
1e460 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20  new hash-chain. 
1e470 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  */.  pPg->pgno =
1e480 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 61 67   pgno;.  h = pag
1e490 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20  er_hash(pgno);. 
1e4a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
1e4b0 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73  sh[h] ){.    ass
1e4c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
1e4d0 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
1e4e0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
1e4f0 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
1e500 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
1e510 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  }.  pPg->pNextHa
1e520 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
1e530 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d  sh[h];.  pPager-
1e540 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
1e550 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  .  pPg->pPrevHas
1e560 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67 2d 3e 64  h = 0;..  pPg->d
1e570 69 72 74 79 20 3d 20 31 3b 0a 20 20 70 50 61 67  irty = 1;.  pPag
1e580 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1e590 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
1e5a0 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
1e5b0 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
1e5c0 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
1e5d0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1e5e0 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
1e5f0 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
1e600 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
1e610 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
1e620 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
1e630 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
1e640 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
1e650 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
1e660 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
1e670 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
1e680 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61   .    ** Pager.a
1e690 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61  InJournal bit ha
1e6a0 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73  s been set. This
1e6b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d   needs to be rem
1e6c0 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67  edied by loading
1e6d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
1e6e0 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d   into the pager-
1e6f0 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e  cache and settin
1e700 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
1e710 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a  Sync flag..    *
1e720 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
1e730 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
1e740 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
1e750 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
1e760 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
1e770 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
1e780 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
1e790 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
1e7a0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
1e7b0 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64 53 79     void *pNeedSy
1e7c0 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nc;.    assert( 
1e7d0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1e7e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1e7f0 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
1e800 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
1e810 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63 29 3b  no, &pNeedSync);
1e820 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e830 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1e840 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
1e850 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1e860 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28    DATA_TO_PGHDR(
1e870 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65 64  pNeedSync)->need
1e880 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44 41  Sync = 1;.    DA
1e890 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
1e8a0 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61  dSync)->inJourna
1e8b0 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f  l = 1;.    DATA_
1e8c0 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1e8d0 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  nc)->dirty = 1;.
1e8e0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
1e8f0 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79 6e 63  _unref(pNeedSync
1e900 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1e910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1e920 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
1e930 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1e940 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1e950 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1e960 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
1e970 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66 69   state of the fi
1e980 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20  le lock for the 
1e990 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
1e9a0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1e9b0 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f   is one of NO_LO
1e9c0 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
1e9d0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a   RESERVED_LOCK,.
1e9e0 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c  ** PENDING_LOCK,
1e9f0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
1ea00 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
1ea10 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74  e3pager_lockstat
1ea20 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1ea30 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1ea40 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70 50  e3OsLockState(pP
1ea50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e  ager->fd);.}.#en
1ea60 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1ea70 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
1ea80 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
1ea90 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
1eaa0 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
1eab0 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
1eac0 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
1ead0 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a  _refdump(Pager *
1eae0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
1eaf0 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67   *pPg;.  for(pPg
1eb00 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1eb10 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1eb20 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
1eb30 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63  pPg->nRef<=0 ) c
1eb40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
1eb50 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1eb60 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25  "PAGE %3d addr=%
1eb70 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20  p nRef=%d\n", . 
1eb80 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c        pPg->pgno,
1eb90 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1eba0 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
1ebb0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
1ebc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1ebd0 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a     OMIT_DISKIO */.