/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact bb2c0007f6e447a4cf7b101e165fc0b79938785f:


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: 39 20 32 30 30 36 2f 30 32 2f 32 34 20 30 32 3a  9 2006/02/24 02:
0360: 35 33 3a 35 30 20 64 72 68 20 45 78 70 20 24 0a  53:50 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 63 6f  ager *pPager, co
84a0: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
84b0: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
84c0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
84d0: 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
84e0: 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
84f0: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
8500: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
8510: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
8520: 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
8530: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
8540: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
8550: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8570: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
8580: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
8590: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
85a0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
85b0: 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d  useCksum==0 it m
85c0: 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61  eans this journa
85d0: 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63  l does not use c
85e0: 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b  hecksums.  Check
85f0: 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  sums.** are not 
8600: 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e  used in statemen
8610: 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75  t journals becau
8620: 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  se statement jou
8630: 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20  rnals do not.** 
8640: 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20  need to survive 
8650: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a  power failures..
8660: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
8670: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
8680: 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  _page(Pager *pPa
8690: 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64  ger, OsFile *jfd
86a0: 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b  , int useCksum){
86b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
86c0: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
86d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
86e0: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
86f0: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
8700: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
8710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8720: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
8730: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
8740: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
8750: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
8760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
8770: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
8780: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
8790: 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c  /.  u8 aData[SQL
87a0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
87b0: 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f  E];  /* Temp sto
87c0: 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20  rage for a page 
87d0: 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75  */..  /* useCksu
87e0: 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65  m should be true
87f0: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f   for the main jo
8800: 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20  urnal and false 
8810: 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  for.  ** stateme
8820: 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65  nt journals.  Ve
8830: 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69  rify that this i
8840: 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73  s always the cas
8850: 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
8860: 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75   jfd == (useCksu
8870: 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  m ? pPager->jfd 
8880: 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20  : pPager->stfd) 
8890: 29 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  );...  rc = read
88a0: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e  32bits(jfd, &pgn
88b0: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
88c0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
88d0: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
88e0: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26  te3OsRead(jfd, &
88f0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
8900: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
8910: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8920: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
8930: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
8940: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
8950: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
8960: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
8970: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
8980: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
8990: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
89a0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
89b0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
89c0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
89d0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
89e0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
89f0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
8a00: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
8a10: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
8a20: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
8a30: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
8a40: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
8a50: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
8a60: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
8a70: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
8a80: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
8a90: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
8aa0: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
8ab0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
8ac0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8ad0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
8ae0: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
8af0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
8b00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8b10: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
8b20: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
8b30: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
8b40: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
8b50: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8b60: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
8b70: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
8b80: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
8b90: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
8ba0: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
8bb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8bc0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
8bd0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
8be0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
8bf0: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
8c00: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
8c10: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
8c20: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
8c30: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
8c40: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
8c50: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
8c60: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
8c70: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
8c80: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
8c90: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
8ca0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
8cb0: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
8cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
8cd0: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
8ce0: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
8cf0: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
8d00: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
8d10: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
8d20: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
8d30: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
8d40: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
8d50: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
8d60: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
8d70: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
8d80: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
8d90: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
8da0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8db0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
8dc0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
8dd0: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
8de0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
8df0: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
8e00: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
8e10: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
8e20: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
8e30: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
8e40: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
8e50: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
8e60: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
8e70: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
8e80: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
8e90: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
8ea0: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
8eb0: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
8ec0: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
8ed0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
8ee0: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
8ef0: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
8f00: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
8f10: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
8f20: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69  s are in the mai
8f30: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
8f40: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
8f50: 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52  ise, if a full R
8f60: 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61  OLLBACK occurs a
8f70: 66 74 65 72 20 74 68 65 20 73 74 61 74 65 6d 65  fter the stateme
8f80: 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  nt.  ** rollback
8f90: 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41   the full ROLLBA
8fa0: 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74  CK will not rest
8fb0: 6f 72 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ore the page to 
8fc0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
8fd0: 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20  * content.  Two 
8fe0: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
8ff0: 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72  be met before wr
9000: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
9010: 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73  abase.  ** files
9020: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
9030: 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65  se must be locke
9040: 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20  d.  (2) we know 
9050: 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
9060: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74  l.  ** page cont
9070: 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61  ent is in the ma
9080: 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65  in journal eithe
9090: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  r because the pa
90a0: 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a  ge is not in.  *
90b0: 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20  * cache or else 
90c0: 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  it is marked as 
90d0: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
90e0: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
90f0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
9100: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
9110: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
9120: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
9130: 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 54 52  | pPg!=0 );.  TR
9140: 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE3("PLAYBACK %
9150: 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
9160: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
9170: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67  gno);.  if( pPag
9180: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
9190: 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70  _EXCLUSIVE && (p
91a0: 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65  Pg==0 || pPg->ne
91b0: 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20  edSync==0) ){.  
91c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
91d0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
91e0: 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
91f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9200: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9210: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9220: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
9230: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
9240: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
9250: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
9260: 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 20 70  .    if( pPg ) p
9270: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
9280: 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
9290: 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
92a0: 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
92b0: 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
92c0: 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
92d0: 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
92e0: 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
92f0: 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
9300: 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
9310: 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
9320: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
9330: 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
9340: 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
9350: 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
9360: 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
9370: 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
9380: 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
9390: 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
93a0: 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
93b0: 20 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72   ** sqlite3pager
93c0: 5f 72 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  _rollback()..   
93d0: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
93e0: 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65  ata;.    /* asse
93f0: 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
9400: 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31   || pPg->pgno==1
9410: 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61   ); */.    pData
9420: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
9430: 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70  (pPg);.    memcp
9440: 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20  y(pData, aData, 
9450: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9460: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
9470: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
9480: 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20  {  /*** FIX ME: 
9490: 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65 20   Should this be 
94a0: 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20  xReinit? ***/.  
94b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
94c0: 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70  tructor(pData, p
94d0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
94e0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
94f0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
9500: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
9510: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
9520: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
9530: 66 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67  f.    CODEC(pPag
9540: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
9550: 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20  pgno, 3);.  }.  
9560: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9570: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
9580: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
9590: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
95a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
95b0: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
95c0: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
95d0: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
95e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
95f0: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
9600: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
9610: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
9620: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
9630: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
9640: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9650: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
9660: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
9670: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9680: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
9690: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
96a0: 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72  f all child jour
96b0: 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c  nals..** To tell
96c0: 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   if a master jou
96d0: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
96e0: 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61  ted, check to ea
96f0: 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69  ch of the.** chi
9700: 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63  ldren.  If all c
9710: 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68  hildren are eith
9720: 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f  er missing or do
9730: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a   not refer to.**
9740: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73   a different mas
9750: 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ter journal, the
9760: 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f  n this master jo
9770: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
9780: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
9790: 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
97a0: 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
97b0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
97c0: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
97d0: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46  _open = 0;.  OsF
97e0: 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b  ile *master = 0;
97f0: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
9800: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
9810: 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
9820: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9830: 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
9840: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
9850: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
9860: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
9870: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
9880: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9890: 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20  ile exclusively 
98a0: 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68  in case some oth
98b0: 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20  er process.  ** 
98c0: 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20  is running this 
98d0: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f  routine also. No
98e0: 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20  t that it makes 
98f0: 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65  too much differe
9900: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  nce..  */.  rc =
9910: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
9920: 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20  adOnly(zMaster, 
9930: 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20  &master);.  if( 
9940: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
9950: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
9960: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
9970: 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  n = 1;.  rc = sq
9980: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
9990: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
99a0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
99b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
99c0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
99d0: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
99e0: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
99f0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
9a00: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
9a10: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
9a20: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
9a30: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
9a40: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
9a50: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
9a60: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
9a70: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
9a80: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
9a90: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
9aa0: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
9ab0: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
9ac0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
9ad0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
9ae0: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
9af0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
9b00: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
9b10: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
9b20: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
9b30: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9b40: 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20  3OsRead(master, 
9b50: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
9b60: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
9b70: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
9b80: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
9b90: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
9ba0: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
9bb0: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
9bc0: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
9bd0: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
9be0: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
9bf0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
9c00: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
9c10: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
9c20: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9c30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
9c40: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
9c50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
9c60: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
9c70: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
9c80: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
9c90: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
9ca0: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
9cb0: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
9cc0: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
9cd0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
9ce0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
9cf0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
9d00: 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20  File *journal = 
9d10: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  0;.        int c
9d20: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
9d30: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
9d40: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
9d50: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
9d60: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
9d70: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
9d80: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
9d90: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
9da0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
9db0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
9dc0: 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65  journal, &zMaste
9dd0: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
9de0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a  qlite3OsClose(&j
9df0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
9e00: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9e10: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
9e20: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
9e30: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
9e40: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
9e50: 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72 63  erPtr!=0 && strc
9e60: 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
9e70: 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
9e80: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
9e90: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
9ea0: 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
9eb0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
9ec0: 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
9ed0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
9ee0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9ef0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
9f00: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9f10: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
9f20: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
9f30: 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a  nal += (strlen(z
9f40: 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20  Journal)+1);.   
9f50: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69   }.  }.  .  sqli
9f60: 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73  te3OsDelete(zMas
9f70: 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  ter);..delmaster
9f80: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73  _out:.  if( zMas
9f90: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
9fa0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
9fb0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
9fc0: 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72  }  .  if( master
9fd0: 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  _open ){.    sql
9fe0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73  ite3OsClose(&mas
9ff0: 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
a000: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a010: 4d 61 6b 65 20 65 76 65 72 79 20 70 61 67 65 20  Make every page 
a020: 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 67 72  in the cache agr
a030: 65 65 20 77 69 74 68 20 77 68 61 74 20 69 73 20  ee with what is 
a040: 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68  on disk.  In oth
a050: 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72  er words,.** rer
a060: 65 61 64 20 74 68 65 20 64 69 73 6b 20 74 6f 20  ead the disk to 
a070: 72 65 73 65 74 20 74 68 65 20 73 74 61 74 65 20  reset the state 
a080: 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  of the cache..**
a090: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a0a0: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
a0b0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77   a rollback in w
a0c0: 68 69 63 68 20 73 6f 6d 65 20 6f 66 20 74 68 65  hich some of the
a0d0: 20 64 69 72 74 79 20 63 61 63 68 65 0a 2a 2a 20   dirty cache.** 
a0e0: 70 61 67 65 73 20 68 61 64 20 6e 65 76 65 72 20  pages had never 
a0f0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f 75 74  been written out
a100: 20 74 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e 65   to disk.  We ne
a110: 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
a120: 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e  the.** cache con
a130: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 65 61 73  tent and the eas
a140: 69 65 73 74 20 77 61 79 20 74 6f 20 64 6f 20 74  iest way to do t
a150: 68 61 74 20 69 73 20 74 6f 20 72 65 72 65 61 64  hat is to reread
a160: 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74   the old content
a170: 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  .** back from th
a180: 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e disk..*/.stati
a190: 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f  c int pager_relo
a1a0: 61 64 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  ad_cache(Pager *
a1b0: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
a1c0: 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
a1d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66  = SQLITE_OK;.  f
a1e0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
a1f0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
a200: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
a210: 20 20 63 68 61 72 20 7a 42 75 66 5b 53 51 4c 49    char zBuf[SQLI
a220: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
a230: 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  ];.    if( !pPg-
a240: 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75  >dirty ) continu
a250: 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  e;.    if( (int)
a260: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
a270: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
a280: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
a290: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
a2a0: 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
a2b0: 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70  pageSize*(i64)(p
a2c0: 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20  Pg->pgno-1));.  
a2d0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a2e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a2f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a300: 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
a310: 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
a320: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
a330: 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52  .      TRACE3("R
a340: 45 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  EFETCH %d page %
a350: 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
a360: 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
a370: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
a380: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43  ) break;.      C
a390: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75  ODEC(pPager, zBu
a3a0: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
a3b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a3c0: 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20     memset(zBuf, 
a3d0: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
a3e0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
a3f0: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
a400: 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   || memcmp(zBuf,
a410: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
a420: 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
a430: 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  eSize) ){.      
a440: 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
a450: 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c  DATA(pPg), zBuf,
a460: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a470: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  e);.      if( pP
a480: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
a490: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
a4a0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48  r->xReiniter(PGH
a4b0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
a4c0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a4d0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
a4e0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
a4f0: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
a500: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
a510: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
a520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a530: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
a540: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
a550: 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
a560: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
a570: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
a580: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
a590: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
a5a0: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
a5b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
a5c0: 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20  uncate the main 
a5d0: 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65  file of the give
a5e0: 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e  n pager to the n
a5f0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
a600: 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a  * indicated..*/.
a610: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a620: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
a630: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61  *pPager, int nPa
a640: 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
a650: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
a660: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
a670: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
a680: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
a690: 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
a6a0: 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
a6b0: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  age);.}../*.** P
a6c0: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
a6d0: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
a6e0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
a6f0: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
a700: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
a710: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
a720: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
a730: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
a740: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
a750: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
a760: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
a770: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
a780: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
a790: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
a7a0: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
a7b0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
a7c0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
a7d0: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
a7e0: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
a7f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
a800: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
a810: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
a820: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
a830: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
a840: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
a850: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a860: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
a870: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
a880: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
a890: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
a8a0: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
a8b0: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
a8c0: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
a8d0: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
a8e0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
a8f0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
a900: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
a910: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
a920: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
a930: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
a940: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
a950: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
a960: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
a970: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
a980: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
a990: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
a9a0: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
a9b0: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
a9c0: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
a9d0: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36  journal.).**  (6
a9e0: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
a9f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
aa00: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
aa10: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
aa20: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
aa30: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
aa40: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
aa50: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
aa60: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
aa70: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
aa80: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
aa90: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
aaa0: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
aab0: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
aac0: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
aad0: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
aae0: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
aaf0: 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  7)  Zero or more
ab00: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
ab10: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
ab20: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
ab30: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
ab40: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
ab50: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ab60: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
ab70: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
ab80: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
ab90: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
aba0: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
abb0: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
abc0: 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65   the first 6 ite
abd0: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
abe0: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
abf0: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
ac00: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68  tance of the 7th
ac10: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
ac20: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
ac30: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
ac40: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
ac50: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
ac60: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
ac70: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
ac80: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
ac90: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
aca0: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
acb0: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
acc0: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
acd0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
ace0: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
acf0: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
ad00: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
ad10: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
ad20: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
ad30: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
ad40: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
ad50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
ad60: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
ad70: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
ad80: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
ad90: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
ada0: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
adb0: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
adc0: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
add0: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
ade0: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
adf0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
ae00: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
ae10: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
ae20: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
ae30: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
ae40: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
ae50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
ae60: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
ae70: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
ae80: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
ae90: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
aea0: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
aeb0: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
aec0: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
aed0: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
aee0: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
aef0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
af00: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
af10: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
af20: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
af30: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
af40: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
af50: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
af60: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
af70: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
af80: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
af90: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
afa0: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
afb0: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
afc0: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
afd0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
afe0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
aff0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
b000: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
b010: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
b020: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
b030: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
b040: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
b050: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
b060: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
b070: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
b080: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
b090: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
b0a0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
b0b0: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
b0c0: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
b0d0: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
b0e0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
b0f0: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
b100: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
b110: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
b120: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
b130: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
b140: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
b150: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
b160: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
b170: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
b180: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
b190: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
b1a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b1b0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
b1c0: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
b1d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b1e0: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
b1f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
b200: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
b220: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
b230: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
b240: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b250: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
b260: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
b270: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
b280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b290: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
b2a0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  ubroutine */.  c
b2b0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
b2c0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
b2d0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
b2e0: 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
b2f0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
b300: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
b310: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
b320: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
b330: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
b340: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
b350: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
b360: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b370: 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
b380: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
b390: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
b3a0: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
b3b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b3c0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
b3d0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
b3e0: 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
b3f0: 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
b400: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
b410: 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
b420: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
b430: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
b440: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
b450: 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
b460: 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
b470: 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
b480: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
b490: 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
b4a0: 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
b4b0: 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
b4c0: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d   */.  rc = readM
b4d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
b4e0: 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74  ger->jfd, &zMast
b4f0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
b500: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
b510: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b520: 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65  TE_OK || (zMaste
b530: 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46  r && !sqlite3OsF
b540: 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65  ileExists(zMaste
b550: 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r)) ){.    sqlit
b560: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
b570: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
b580: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
b590: 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20  ITE_DONE ) rc = 
b5a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
b5b0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
b5c0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
b5d0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
b5e0: 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  d, 0);.  pPager-
b5f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
b600: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
b610: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
b620: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
b630: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
b640: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
b650: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
b660: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
b670: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
b680: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
b690: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
b6a0: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
b6b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
b6c0: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
b6d0: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
b6e0: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
b6f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
b700: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
b710: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
b720: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
b730: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
b740: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
b750: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
b760: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
b770: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
b780: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
b790: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
b7a0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
b7b0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
b7c0: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
b7d0: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
b7e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
b7f0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b800: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
b810: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b820: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
b830: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
b840: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
b850: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
b860: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
b870: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
b880: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
b890: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
b8a0: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
b8b0: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
b8c0: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
b8d0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
b8e0: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
b8f0: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
b900: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
b910: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
b920: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
b930: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
b940: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
b950: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
b960: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
b970: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
b980: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
b990: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
b9a0: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
b9b0: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
b9c0: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
b9d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
b9e0: 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
b9f0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
ba00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
ba10: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
ba20: 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
ba30: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
ba40: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
ba50: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
ba60: 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72   back to it's or
ba70: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
ba80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
ba90: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
baa0: 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 0a 20  _EXCLUSIVE && . 
bab0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
bac0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
bad0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
bae0: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
baf0: 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  t( pPager->origD
bb00: 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67  bSize==0 || pPag
bb10: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
bb20: 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63  mxPg );.      rc
bb30: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
bb40: 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
bb50: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
bb60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bb70: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
bb80: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
bb90: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
bba0: 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
bbb0: 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20 3d 20 73  }..    /* rc = s
bbc0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
bbd0: 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41  ger->jfd, JOURNA
bbe0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
bbf0: 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ); */.    if( rc
bc00: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
bc10: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
bc20: 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  .  .    /* Copy 
bc30: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
bc40: 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
bc50: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
bc60: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bc70: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
bc80: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
bc90: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
bca0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
bcb0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
bcc0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
bcd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
bce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bcf0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
bd00: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
bd10: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
bd20: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
bd30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
bd40: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
bd50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bd70: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
bd80: 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
bd90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bda0: 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74 68  }..  /* Pages th
bdb0: 61 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  at have been wri
bdc0: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
bdd0: 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73 79  nal but never sy
bde0: 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65 20  nced.  ** where 
bdf0: 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79 20  not restored by 
be00: 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20  the loop above. 
be10: 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 73 74   We have to rest
be20: 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70  ore those.  ** p
be30: 61 67 65 73 20 62 79 20 72 65 61 64 69 6e 67 20  ages by reading 
be40: 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74  them back from t
be50: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
be60: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  base..  */.  ass
be70: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
be80: 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f 72 65  OK );.  pager_re
be90: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
bea0: 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63  r);..end_playbac
beb0: 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  k:.  if( rc==SQL
bec0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
bed0: 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
bee0: 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
bef0: 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20  }.  if( zMaster 
bf00: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
bf10: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
bf20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
bf30: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
bf40: 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a  turn true,.    *
bf50: 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
bf60: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
bf70: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
bf80: 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
bf90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bfa0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
bfb0: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
bfc0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d  (zMaster);.    }
bfd0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
bfe0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  zMaster);.  }.. 
bff0: 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
c000: 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
c010: 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
c020: 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
c030: 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
c040: 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
c050: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
c060: 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
c070: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
c080: 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  E.  ** value. Re
c090: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
c0a0: 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
c0b0: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
c0c0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63  */.  pPager->sec
c0d0: 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f  torSize = PAGER_
c0e0: 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 72  SECTOR_SIZE;.  r
c0f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c100: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
c110: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
c120: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  l..**.** This is
c130: 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79   similar to play
c140: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61  ing back the tra
c150: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
c160: 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66   but with.** a f
c170: 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e  ew extra twists.
c180: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
c190: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
c1a0: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
c1b0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
c1c0: 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  tart of.**      
c1d0: 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74     the statement
c1e0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50   is stored in pP
c1f0: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20  ager->stmtSize, 
c200: 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  not in the.**   
c210: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69        journal fi
c220: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a  le itself..**.**
c230: 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69      (2)  In addi
c240: 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20  tion to playing 
c250: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
c260: 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f  nt journal, also
c270: 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79  .**         play
c280: 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f  back all pages o
c290: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
c2a0: 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e  n journal beginn
c2b0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ing.**         a
c2c0: 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d  t offset pPager-
c2d0: 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73  >stmtJSize..*/.s
c2e0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
c2f0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61  stmt_playback(Pa
c300: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c310: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
c320: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
c330: 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75   of the full jou
c340: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64  rnal */.  i64 hd
c350: 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rOff;.  int nRec
c360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c370: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
c380: 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69  cords */.  int i
c390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c3a0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
c3b0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
c3c0: 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  ..  szJ = pPager
c3d0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69  ->journalOff;.#i
c3e0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20  fndef NDEBUG .  
c3f0: 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a  {.    i64 os_szJ
c400: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c410: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
c420: 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a  ger->jfd, &os_sz
c430: 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  J);.    if( rc!=
c440: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
c450: 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72  rn rc;.    asser
c460: 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29  t( szJ==os_szJ )
c470: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
c480: 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f  /* Set hdrOff to
c490: 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 74   be the offset t
c4a0: 6f 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  o the first jour
c4b0: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
c4c0: 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 73 74 61  en.  ** this sta
c4d0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
c4e0: 6f 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f  on, or the end o
c4f0: 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f  f the file if no
c500: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65   journal.  ** he
c510: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
c520: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20  ..  */.  hdrOff 
c530: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  = pPager->stmtHd
c540: 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  rOff;.  assert( 
c550: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
c560: 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20   || !hdrOff );. 
c570: 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a   if( !hdrOff ){.
c580: 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a      hdrOff = szJ
c590: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72  ;.  }.  .  /* Tr
c5a0: 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62  uncate the datab
c5b0: 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20  ase back to its 
c5c0: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
c5d0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
c5e0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
c5f0: 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
c600: 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
c610: 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  ate(pPager, pPag
c620: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20  er->stmtSize);. 
c630: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53   }.  pPager->dbS
c640: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ize = pPager->st
c650: 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69  mtSize;..  /* Fi
c660: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
c670: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
c680: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
c690: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
c6a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
c6b0: 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67  tmtInUse && pPag
c6c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
c6d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65  );.  sqlite3OsSe
c6e0: 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ek(pPager->stfd,
c6f0: 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50   0);.  nRec = pP
c700: 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a  ager->stmtNRec;.
c710: 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69    .  /* Copy ori
c720: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
c730: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
c740: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
c750: 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  k into the.  ** 
c760: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
c770: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74  Note that the st
c780: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
c790: 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20  omits checksums 
c7a0: 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72  from.  ** each r
c7b0: 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65  ecord since powe
c7c0: 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65  r-failure recove
c7d0: 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74  ry is not import
c7e0: 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74  ant to statement
c7f0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a  .  ** journals..
c800: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65    */.  for(i=nRe
c810: 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  c-1; i>=0; i--){
c820: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
c830: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
c840: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
c850: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->stfd, 0);.    
c860: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
c870: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
c880: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c890: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
c8a0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
c8b0: 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f    /* Now roll so
c8c0: 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72  me pages back fr
c8d0: 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  om the transacti
c8e0: 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65  on journal. Page
c8f0: 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a  r.stmtJSize.  **
c900: 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66   was the size of
c910: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c920: 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74  e when this stat
c930: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
c940: 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79  d, so.  ** every
c950: 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74  thing after that
c960: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
c970: 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72  led back, either
c980: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
c990: 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d  atabase, the mem
c9a0: 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f  ory cache, or bo
c9b0: 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  th..  **.  ** If
c9c0: 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   it is not zero,
c9d0: 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74   then Pager.stmt
c9e0: 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66  HdrOff is the of
c9f0: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
ca00: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69  t.  ** of the fi
ca10: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
ca20: 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e  er written durin
ca30: 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  g this statement
ca40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
ca50: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
ca60: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
ca70: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  jfd, pPager->stm
ca80: 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
ca90: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
caa0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
cab0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
cac0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
cad0: 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  lOff = pPager->s
cae0: 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67  tmtJSize;.  pPag
caf0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20  er->cksumInit = 
cb00: 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
cb10: 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 4a 4f 55  m;.  assert( JOU
cb20: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
cb30: 65 72 29 3c 28 70 50 61 67 65 72 2d 3e 70 61 67  er)<(pPager->pag
cb40: 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68  eSize+8) );.  wh
cb50: 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
cb60: 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f  rnalOff <= (hdrO
cb70: 66 66 2d 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ff-(pPager->page
cb80: 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20 20  Size+8)) ){.    
cb90: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
cba0: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
cbb0: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
cbc0: 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
cbd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
cbe0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
cbf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
cc00: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
cc10: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
cc20: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
cc30: 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
cc40: 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20     u32 nJRec;   
cc50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cc60: 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
cc70: 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
cc80: 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
cc90: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
cca0: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
ccb0: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
ccc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ccd0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
cce0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
ccf0: 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
cd00: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
cd10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
cd20: 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20   nJRec==0 ){.   
cd30: 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20     nJRec = (szJ 
cd40: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
cd50: 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d  lOff) / (pPager-
cd60: 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20  >pageSize+8);.  
cd70: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a    }.    for(i=nJ
cd80: 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
cd90: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cda0: 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
cdb0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
cdc0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
cdd0: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
cde0: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20  ->jfd, 1);.     
cdf0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
ce00: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
ce10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ce20: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
ce30: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
ce40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
ce50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
ce60: 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74  szJ;.  .end_stmt
ce70: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
ce80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
ce90: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
cea0: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
ceb0: 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c      /* pager_rel
cec0: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
ced0: 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ); */.  }.  retu
cee0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
cef0: 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
cf00: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
cf10: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
cf20: 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
cf30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
cf40: 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a  ger_set_cachesiz
cf50: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
cf60: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
cf70: 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b  if( mxPage>10 ){
cf80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
cf90: 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  age = mxPage;.  
cfa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
cfb0: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a  r->mxPage = 10;.
cfc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a    }.}../*.** Adj
cfd0: 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
cfe0: 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
cff0: 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
d000: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
d010: 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
d020: 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
d030: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
d040: 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
d050: 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
d060: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
d070: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
d080: 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
d090: 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
d0a0: 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
d0b0: 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
d0c0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
d0d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
d0e0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
d0f0: 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
d100: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
d110: 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
d120: 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
d130: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
d140: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
d150: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
d160: 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
d170: 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
d180: 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
d190: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d1a0: 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
d1b0: 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
d1c0: 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
d1d0: 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
d1e0: 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
d1f0: 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
d200: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
d210: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
d230: 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
d240: 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
d250: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d260: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d270: 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
d280: 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
d290: 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
d2a0: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
d2b0: 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
d2c0: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
d2d0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
d2e0: 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
d2f0: 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
d300: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
d310: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
d320: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
d330: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
d340: 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
d350: 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
d360: 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
d370: 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
d380: 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
d390: 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
d3b0: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
d3c0: 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
d3d0: 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
d3e0: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
d3f0: 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
d400: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
d410: 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
d420: 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
d430: 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
d440: 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
d450: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
d460: 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
d470: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ck..**.** Numeri
d480: 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
d490: 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
d4a0: 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
d4b0: 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
d4c0: 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
d4d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d4e0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
d4f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
d500: 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65 76  r_set_safety_lev
d510: 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
d520: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
d530: 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20   full_fsync){.  
d540: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
d550: 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50    level==1 || pP
d560: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
d570: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
d580: 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26  nc = level==3 &&
d590: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
d5a0: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
d5b0: 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f  ll_fsync = full_
d5c0: 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50 61  fsync;.  if( pPa
d5d0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
d5e0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
d5f0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
d600: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
d610: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
d620: 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
d630: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
d640: 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
d650: 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
d660: 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
d670: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
d680: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
d690: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
d6a0: 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74  s only.  .*/.int
d6b0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
d6c0: 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a  p_count = 0;../*
d6d0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
d6e0: 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74  rary file.  Writ
d6f0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
d700: 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c  e file into zFil
d710: 65 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74  e.** (zFile must
d720: 20 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c   be at least SQL
d730: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
d740: 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20  E bytes long.)  
d750: 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c  Write.** the fil
d760: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
d770: 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
d780: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
d790: 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
d7a0: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
d7b0: 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  if we fail..**.*
d7c0: 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  * The OS will au
d7d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
d7e0: 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
d7f0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
d800: 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  .** closed..*/.s
d810: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
d820: 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
d830: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46  char *zFile, OsF
d840: 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e  ile **pFd){.  in
d850: 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74  t cnt = 8;.  int
d860: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f   rc;.  sqlite3_o
d870: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
d880: 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
d890: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
d8a0: 69 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b  is only */.  do{
d8b0: 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20  .    cnt--;.    
d8c0: 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c  sqlite3OsTempFil
d8d0: 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20  eName(zFile);.  
d8e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d8f0: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46  OpenExclusive(zF
d900: 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20  ile, pFd, 1);.  
d910: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
d920: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
d930: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
d940: 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
d950: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
d960: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
d970: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
d980: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
d990: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
d9a0: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
d9b0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
d9c0: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
d9d0: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
d9e0: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
d9f0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
da00: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
da10: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
da20: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
da30: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
da40: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
da50: 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ng sqlite3pager_
da60: 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  unref()..**.** I
da70: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
da80: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
da90: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
daa0: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
dab0: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
dac0: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
dad0: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
dae0: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
daf0: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
db00: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
db10: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
db20: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
db30: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
db40: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
db50: 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
db60: 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
db70: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
db80: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
db90: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
dba0: 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
dbb0: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
dbc0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
dbd0: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
dbe0: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
dbf0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
dc00: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
dc10: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
dc20: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
dc30: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
dc40: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
dc50: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
dc60: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
dc70: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
dc80: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
dc90: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
dca0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dcc0: 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
dcd0: 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  g this file */.)
dce0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
dcf0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
dd00: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30  FullPathname = 0
dd10: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
dd20: 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73    /* Compiler is
dd30: 20 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20   wrong. This is 
dd40: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
dd50: 65 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f  ed before use */
dd60: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20  .  OsFile *fd;. 
dd70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
dd80: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
dd90: 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
dda0: 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  ;.  int memDb = 
ddb0: 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  0;.  int readOnl
ddc0: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65  y = 0;.  int use
ddd0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
dde0: 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
ddf0: 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74  URNAL)==0;.  int
de00: 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66   noReadlock = (f
de10: 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f  lags & PAGER_NO_
de20: 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20  READLOCK)!=0;.  
de30: 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54  char zTemp[SQLIT
de40: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
de50: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
de60: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
de70: 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20  NAGEMENT.  /* A 
de80: 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20  malloc() cannot 
de90: 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54  fail in sqlite3T
dea0: 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f  hreadData() as o
deb0: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73  ne or more calls
dec0: 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   to .  ** malloc
ded0: 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  () must have alr
dee0: 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62  eady been made b
def0: 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65  y this thread be
df00: 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a  fore it gets.  *
df10: 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e  * to this point.
df20: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
df30: 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20  ThreadData must 
df40: 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61  have been alloca
df50: 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ted already.  **
df60: 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44   so that ThreadD
df70: 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62  ata.nAlloc can b
df80: 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20  e set. It would 
df90: 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72  be nice to asser
dfa0: 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65  t.  ** that Thre
dfb0: 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73  adData.nAlloc is
dfc0: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61   non-zero, but a
dfd0: 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20  las this breaks 
dfe0: 74 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a  test cases .  **
dff0: 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f   written to invo
e000: 6b 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72  ke the pager dir
e010: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68  ectly..  */.  Th
e020: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d  readData *pTsd =
e030: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
e040: 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta();.  assert( 
e050: 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  pTsd );.#endif..
e060: 20 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29    /* If malloc()
e070: 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69   has already fai
e080: 6c 65 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  led return SQLIT
e090: 45 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20  E_NOMEM. Before 
e0a0: 65 76 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e  even.  ** testin
e0b0: 67 20 66 6f 72 20 74 68 69 73 2c 20 73 65 74 20  g for this, set 
e0c0: 2a 70 70 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c  *ppPager to NULL
e0d0: 20 73 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6b   so the caller k
e0e0: 6e 6f 77 73 20 74 68 65 20 70 61 67 65 72 0a 20  nows the pager. 
e0f0: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 77 61   ** structure wa
e100: 73 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65  s never allocate
e110: 64 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61  d. .  */.  *ppPa
e120: 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ger = 0;.  if( s
e130: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
e140: 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ed() ){.    retu
e150: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e160: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66  .  }.  memset(&f
e170: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29  d, 0, sizeof(fd)
e180: 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
e190: 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64  e pager file and
e1a0: 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61   set zFullPathna
e1b0: 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d  me to point at m
e1c0: 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20  alloc()ed .  ** 
e1d0: 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  memory containin
e1e0: 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66  g the complete f
e1f0: 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e  ilename (i.e. in
e200: 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65  cluding the dire
e210: 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69  ctory)..  */.  i
e220: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
e230: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
e240: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e250: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
e260: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
e270: 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
e280: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
e290: 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
e2a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e2b0: 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b  qliteStrDup("");
e2c0: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
e2d0: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46  f.    {.      zF
e2e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
e2f0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
e300: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
e310: 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50        if( zFullP
e320: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
e330: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e340: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a  sOpenReadWrite(z
e350: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66  FullPathname, &f
e360: 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20  d, &readOnly);. 
e370: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e380: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
e390: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
e3a0: 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29  temp(zTemp, &fd)
e3b0: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
e3c0: 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75  = zTemp;.    zFu
e3d0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
e3e0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
e3f0: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
e400: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e410: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65  E_OK ){.      te
e420: 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
e430: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
e440: 63 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73  cate the Pager s
e450: 74 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72  tructure. As par
e460: 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c  t of the same al
e470: 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61  location, alloca
e480: 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f  te.  ** space fo
e490: 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73  r the full paths
e4a0: 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69   of the file, di
e4b0: 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72  rectory and jour
e4c0: 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72  nal .  ** (Pager
e4d0: 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65  .zFilename, Page
e4e0: 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64  r.zDirectory and
e4f0: 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29   Pager.zJournal)
e500: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75  ..  */.  if( zFu
e510: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
e520: 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c    nameLen = strl
e530: 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  en(zFullPathname
e540: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
e550: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
e560: 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20  zeof(*pPager) + 
e570: 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29  nameLen*3 + 30 )
e580: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
e590: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
e5a0: 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
e5b0: 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
e5c0: 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a  ree the memory .
e5d0: 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
e5e0: 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  by zFullPathname
e5f0: 2c 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72  , free the Pager
e600: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
e610: 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  lose the .  ** f
e620: 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70  ile. Since the p
e630: 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
e640: 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
e650: 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
e660: 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
e670: 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
e680: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
e690: 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74  ger || !zFullPat
e6a0: 68 6e 61 6d 65 20 7c 7c 20 72 63 21 3d 53 51 4c  hname || rc!=SQL
e6b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
e6c0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64  lite3OsClose(&fd
e6d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
e6e0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e6f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
e700: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
e710: 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
e720: 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d  E_OK)?SQLITE_NOM
e730: 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 54  EM:rc);.  }..  T
e740: 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25  RACE3("OPEN %d %
e750: 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
e760: 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74  ID(fd), zFullPat
e770: 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72  hname);.  pPager
e780: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
e790: 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  har*)&pPager[1];
e7a0: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  .  pPager->zDire
e7b0: 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d  ctory = &pPager-
e7c0: 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c  >zFilename[nameL
e7d0: 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  en+1];.  pPager-
e7e0: 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
e7f0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
e800: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74  nameLen+1];.  st
e810: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  rcpy(pPager->zFi
e820: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
e830: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
e840: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
e850: 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ory, zFullPathna
e860: 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61  me);..  for(i=na
e870: 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50  meLen; i>0 && pP
e880: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
e890: 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  [i-1]!='/'; i--)
e8a0: 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70  {}.  if( i>0 ) p
e8b0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e8c0: 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74  y[i-1] = 0;.  st
e8d0: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rcpy(pPager->zJo
e8e0: 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68  urnal, zFullPath
e8f0: 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  name);.  sqliteF
e900: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e910: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50  e);.  strcpy(&pP
e920: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
e930: 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e  ameLen], "-journ
e940: 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  al");.  pPager->
e950: 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50  fd = fd;.  /* pP
e960: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
e970: 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  n = 0; */.  pPag
e980: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
e990: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21   useJournal && !
e9a0: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
e9b0: 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f  >noReadlock = no
e9c0: 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64  Readlock && read
e9d0: 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
e9e0: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
e9f0: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
ea00: 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
ea10: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
ea20: 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  nRef = 0; */.  p
ea30: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
ea40: 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65  memDb-1;.  pPage
ea50: 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51  r->pageSize = SQ
ea60: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
ea70: 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61  E_SIZE;.  /* pPa
ea80: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
ea90: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
eaa0: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
eab0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
eac0: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
ead0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61    /* pPager->nMa
eae0: 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  xPage = 0; */.  
eaf0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
eb00: 20 31 30 30 3b 0a 20 20 61 73 73 65 72 74 28 20   100;.  assert( 
eb10: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20  PAGER_UNLOCK==0 
eb20: 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
eb30: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
eb40: 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50  LOCK; */.  /* pP
eb50: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
eb60: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
eb70: 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46  tempFile = tempF
eb80: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
eb90: 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
eba0: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
ebb0: 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f   = readOnly;.  /
ebc0: 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
ebd0: 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  nc = 0; */.  pPa
ebe0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
ebf0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
ec00: 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
ec10: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
ec20: 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  c = (pPager->noS
ec30: 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70  ync?0:1);.  /* p
ec40: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
ec50: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
ec60: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
ec70: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
ec80: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
ec90: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
eca0: 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47  tra = FORCE_ALIG
ecb0: 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20  NMENT(nExtra);. 
ecc0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
ecd0: 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54  ize = PAGER_SECT
ece0: 4f 52 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50  OR_SIZE;.  /* pP
ecf0: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
ed00: 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
ed10: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
ed20: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
ed30: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
ed40: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
ed50: 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20   pPager;.#ifdef 
ed60: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
ed70: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
ed80: 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20    pPager->pNext 
ed90: 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a  = pTsd->pPager;.
eda0: 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d    pTsd->pPager =
edb0: 20 70 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a   pPager;.#endif.
edc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
edd0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
ede0: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
edf0: 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  r function..*/.v
ee00: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
ee10: 5f 73 65 74 5f 62 75 73 79 68 61 6e 64 6c 65 72  _set_busyhandler
ee20: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ee30: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
ee40: 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50  syHandler){.  pP
ee50: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
ee60: 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  er = pBusyHandle
ee70: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
ee80: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
ee90: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
eea0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
eeb0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63   destructor is c
eec0: 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  alled.** when th
eed0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
eee0: 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72  t on each page r
eef0: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68  eaches zero.  Th
ef00: 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e  e destructor can
ef10: 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
ef20: 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74  lean up informat
ef30: 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61  ion in the extra
ef40: 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65   segment appende
ef50: 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a  d to each page..
ef60: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
ef70: 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
ef80: 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
ef90: 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
efa0: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
efb0: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
efc0: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33  alled by sqlite3
efd0: 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a  pager_unref()..*
efe0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
eff0: 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74  ger_set_destruct
f000: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
f010: 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
f020: 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  void*,int)){.  p
f030: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
f040: 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f  or = xDesc;.}../
f050: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69  *.** Set the rei
f060: 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74  nitializer for t
f070: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
f080: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69  ot NULL, the rei
f090: 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73  nitializer.** is
f0a0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
f0b0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61   content of a pa
f0c0: 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72  ge in cache is r
f0d0: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
f0e0: 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  riginal.** value
f0f0: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
f100: 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  a rollback.  The
f110: 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20   callback gives 
f120: 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
f130: 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e  e.** an opportun
f140: 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
f150: 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
f160: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
f170: 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70  he restored.** p
f180: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69  age data..*/.voi
f190: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
f1a0: 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61 67 65  et_reiniter(Page
f1b0: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
f1c0: 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69 64 2a  (*xReinit)(void*
f1d0: 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
f1e0: 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
f1f0: 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  einit;.}../*.** 
f200: 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  Set the page siz
f210: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
f220: 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65  ew size.  If the
f230: 20 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67   suggest new pag
f240: 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61  e.** size is ina
f250: 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e  ppropriate, then
f260: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
f270: 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c  page size is sel
f280: 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74  ected.** and ret
f290: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
f2a0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70  lite3pager_set_p
f2b0: 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
f2c0: 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53  Pager, int pageS
f2d0: 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
f2e0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
f2f0: 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
f300: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
f310: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
f320: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ->memDb ){.    p
f330: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
f340: 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a  = pageSize;.  }.
f350: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
f360: 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
f370: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
f380: 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
f390: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
f3a0: 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
f3b0: 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
f3c0: 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
f3d0: 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
f3e0: 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
f3f0: 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
f400: 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
f410: 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
f420: 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
f430: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
f440: 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
f450: 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
f460: 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
f470: 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
f480: 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
f490: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
f4a0: 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
f4b0: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
f4c0: 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
f4d0: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
f4e0: 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
f4f0: 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
f500: 69 64 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74  id clear_simulat
f510: 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 7b 0a 20  ed_io_error(){. 
f520: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
f530: 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69  r_hit = 0;.}.voi
f540: 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
f550: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
f560: 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
f570: 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
f580: 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
f590: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f5a0: 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
f5b0: 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
f5c0: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
f5d0: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
f5e0: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
f5f0: 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
f600: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
f610: 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f  clear_simulated_
f620: 69 6f 5f 65 72 72 6f 72 28 29 0a 23 20 64 65 66  io_error().# def
f630: 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
f640: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
f650: 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
f660: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
f670: 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
f680: 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
f690: 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
f6a0: 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
f6b0: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
f6c0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
f6d0: 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
f6e0: 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72   .**.** No error
f6f0: 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
f700: 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20  e. The rational 
f710: 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
f720: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   this function .
f730: 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ** may be called
f740: 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c   even if the fil
f750: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
f760: 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65   or contain a he
f770: 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65  ader. In .** the
f780: 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33  se cases sqlite3
f790: 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65  OsRead() will re
f7a0: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74  turn an error, t
f7b0: 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72  o which the corr
f7c0: 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65  ect .** response
f7d0: 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20   is to zero the 
f7e0: 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20  memory at pDest 
f7f0: 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41  and continue.  A
f800: 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a   real IO error .
f810: 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62  ** will presumab
f820: 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20  ly recur and be 
f830: 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20  picked up later 
f840: 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f  (Todo: Think abo
f850: 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 76 6f 69  ut this)..*/.voi
f860: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  d sqlite3pager_r
f870: 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28 50  ead_fileheader(P
f880: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
f890: 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
f8a0: 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65  ar *pDest){.  me
f8b0: 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
f8c0: 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d  );.  if( MEMDB==
f8d0: 30 20 29 7b 0a 20 20 20 20 64 69 73 61 62 6c 65  0 ){.    disable
f8e0: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
f8f0: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
f900: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
f910: 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 73 71  ->fd, 0);.    sq
f920: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
f930: 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
f940: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
f950: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
f960: 73 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  s();.  }.}../*.*
f970: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
f980: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
f990: 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
f9a0: 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
f9b0: 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a  ith.** pPager. .
f9c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e  **.** If the PEN
f9d0: 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f  DING_BYTE lies o
f9e0: 6e 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63  n the page direc
f9f0: 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e  tly after the en
fa00: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  d of the.** file
fa10: 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20  , then consider 
fa20: 74 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f  this page part o
fa30: 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20  f the file too. 
fa40: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  For example, if.
fa50: 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ** PENDING_BYTE 
fa60: 69 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68  is byte 4096 (th
fa70: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
fa80: 70 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20  page 5) and the 
fa90: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  size of the.** f
faa0: 69 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65  ile is 4096 byte
fab0: 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64  s, 5 is returned
fac0: 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a   instead of 4..*
fad0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
fae0: 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67  er_pagecount(Pag
faf0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
fb00: 36 34 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  64 n;.  assert( 
fb10: 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69  pPager!=0 );.  i
fb20: 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
fb30: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20  e>=0 ){.    n = 
fb40: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
fb50: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69    } else {.    i
fb60: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
fb70: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
fb80: 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   &n)!=SQLITE_OK 
fb90: 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
fba0: 72 72 6f 72 28 70 50 61 67 65 72 2c 20 53 51 4c  rror(pPager, SQL
fbb0: 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 20 20  ITE_IOERR);.    
fbc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
fbd0: 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
fbe0: 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53   n<pPager->pageS
fbf0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  ize ){.      n =
fc00: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
fc10: 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72       n /= pPager
fc20: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
fc30: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
fc40: 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
fc50: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
fc60: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
fc70: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
fc80: 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42  f( n==(PENDING_B
fc90: 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
fca0: 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b  Size) ){.    n++
fcb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
fcc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  ;.}../*.** Forwa
fcd0: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
fce0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
fcf0: 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29  cJournal(Pager*)
fd00: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  ;.../*.** Unlink
fd10: 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
fd20: 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20  ash chain. Also 
fd30: 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  set the page num
fd40: 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ber to 0 to indi
fd50: 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  cate.** that the
fd60: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72   page is not par
fd70: 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68  t of any hash ch
fd80: 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71  ain. This is req
fd90: 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68  uired because th
fda0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65  e.** sqlite3page
fdb0: 72 5f 6d 6f 76 65 70 61 67 65 28 29 20 72 6f 75  r_movepage() rou
fdc0: 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61  tine can leave a
fdd0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
fde0: 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76   pNextFree/pPrev
fdf0: 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69  Free list that i
fe00: 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20  s not a part of 
fe10: 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a  any hash-chain..
fe20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
fe30: 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50  nlinkHashChain(P
fe40: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
fe50: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
fe60: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
fe70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
fe80: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 7a 65  age number is ze
fe90: 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ro, then this pa
fea0: 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 61 6e 79  ge is not in any
feb0: 20 68 61 73 68 20 63 68 61 69 6e 2e 20 2a 2f 0a   hash chain. */.
fec0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
fed0: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
fee0: 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d  Hash ){.    pPg-
fef0: 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
ff00: 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  vHash = pPg->pPr
ff10: 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66  evHash;.  }.  if
ff20: 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  ( pPg->pPrevHash
ff30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ff40: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61  pPager->aHash[pa
ff50: 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67  ger_hash(pPg->pg
ff60: 6e 6f 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20  no)]!=pPg );.   
ff70: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d   pPg->pPrevHash-
ff80: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
ff90: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
ffa0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20  else{.    int h 
ffb0: 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67  = pager_hash(pPg
ffc0: 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
ffd0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
ffe0: 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20  sh[h]==pPg );.  
fff0: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
10000 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  h] = pPg->pNextH
10010 61 73 68 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d  ash;.  }..  pPg-
10020 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67  >pgno = 0;.  pPg
10030 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
10040 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
10050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
10060 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  k a page from th
10070 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65  e free list (the
10080 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
10090 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30  es where nRef==0
100a0 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74  ).** and from it
100b0 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  s hash collision
100c0 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   chain..*/.stati
100d0 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67  c void unlinkPag
100e0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
100f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
10100 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
10110 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69   /* Keep the pFi
10120 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65  rstSynced pointe
10130 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  r pointing at th
10140 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e  e first synchron
10150 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ized page */.  i
10160 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  f( pPg==pPager->
10170 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
10180 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
10190 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
101a0 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
101b0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
101c0 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
101d0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
101e0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
101f0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
10200 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
10210 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  st */.  if( pPg-
10220 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
10230 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
10240 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
10250 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10260 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
10270 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
10280 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
10290 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
102a0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
102b0 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
102c0 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70  extFree ){.    p
102d0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
102e0 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
102f0 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c  pPrevFree;.  }el
10300 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
10310 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70  pPager->pLast==p
10320 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
10330 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
10340 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20  PrevFree;.  }.  
10350 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
10360 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
10370 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  = 0;..  /* Unlin
10380 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20  k from the pgno 
10390 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
103a0 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
103b0 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a  pPager, pPg);.}.
103c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
103d0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
103e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
103f0 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e   is used to trun
10400 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  cate an in-memor
10410 79 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c  y database.  Del
10420 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73  ete.** all pages
10430 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c   whose pgno is l
10440 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
10450 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73  r->dbSize and is
10460 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a   unreferenced..*
10470 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67  * Referenced pag
10480 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  es larger than p
10490 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72  Pager->dbSize ar
104a0 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61  e zeroed..*/.sta
104b0 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54  tic void memoryT
104c0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
104d0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
104e0 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a  *pPg;.  PgHdr **
104f0 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69  ppPg;.  int dbSi
10500 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
10510 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26  ize;..  ppPg = &
10520 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
10530 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70  while( (pPg = *p
10540 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  pPg)!=0 ){.    i
10550 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62  f( pPg->pgno<=db
10560 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70  Size ){.      pp
10570 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
10580 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  All;.    }else i
10590 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  f( pPg->nRef>0 )
105a0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
105b0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
105c0 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
105d0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70  geSize);.      p
105e0 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
105f0 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tAll;.    }else{
10600 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70  .      *ppPg = p
10610 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
10620 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70      unlinkPage(p
10630 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Pg);.      sqlit
10640 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  eFree(pPg);.    
10650 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d    pPager->nPage-
10660 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  -;.    }.  }.}.#
10670 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d  else.#define mem
10680 6f 72 79 54 72 75 6e 63 61 74 65 28 70 29 0a 23  oryTruncate(p).#
10690 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  endif../*.** Try
106a0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
106b0 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e  k on a file.  In
106c0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61  voke the busy ca
106d0 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
106e0 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ck.** is current
106f0 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
10700 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20  .  Repeat until 
10710 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
10720 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c  k returns.** fal
10730 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
10740 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
10750 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
10760 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
10770 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
10780 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
10790 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
107a0 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
107b0 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
107c0 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
107d0 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
107e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
107f0 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
10800 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
10810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
10820 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
10830 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
10840 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
10850 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
10860 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
10870 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
10880 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
10890 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
108a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
108b0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
108c0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
108d0 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
108e0 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
108f0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
10900 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  & sqlite3InvokeB
10910 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
10920 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r->pBusyHandler)
10930 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
10940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10950 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
10960 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20   = locktype;.   
10970 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10980 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
10990 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
109a0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
109b0 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e  pages specified.
109c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
109d0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
109e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
109f0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
10a00 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67  rc;.  sqlite3pag
10a10 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
10a20 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
10a30 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
10a40 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
10a50 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74  errCode;.    ret
10a60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
10a70 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e  ( nPage>=(unsign
10a80 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
10a90 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10ab0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
10ac0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
10ad0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
10ae0 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
10af0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
10b00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
10b10 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
10b20 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
10b30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10b40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10b50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
10b60 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
10b70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
10b80 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
10b90 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ing. */.  rc = p
10ba0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
10bb0 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
10bc0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28  IVE_LOCK);.  if(
10bd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10be0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10bf0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67  .  }..  rc = pag
10c00 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
10c10 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66  er, nPage);.  if
10c20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10c30 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
10c40 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
10c50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10c60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
10c70 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
10c80 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
10c90 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
10ca0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
10cb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
10cc0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
10cd0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10ce0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
10cf0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
10d00 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
10d10 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
10d20 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
10d30 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
10d40 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
10d50 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
10d60 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
10d70 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
10d80 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
10d90 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
10da0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
10db0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
10dc0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
10dd0 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
10de0 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
10df0 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
10e00 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
10e10 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
10e20 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
10e30 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
10e40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
10e50 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
10e60 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
10e70 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
10e80 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
10e90 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
10ea0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
10eb0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
10ec0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
10ed0 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  _close(Pager *pP
10ee0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
10ef0 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 23 69 66  pPg, *pNext;.#if
10f00 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10f10 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
10f20 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  ENT.  /* A mallo
10f30 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  c() cannot fail 
10f40 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  in sqlite3Thread
10f50 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72  Data() as one or
10f60 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a   more calls to .
10f70 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75    ** malloc() mu
10f80 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
10f90 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69  been made by thi
10fa0 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20  s thread before 
10fb0 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20  it gets.  ** to 
10fc0 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73  this point. This
10fd0 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61   means the Threa
10fe0 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20  dData must have 
10ff0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
11000 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74  lready.  ** so t
11010 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
11020 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74  Alloc can be set
11030 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44  ..  */.  ThreadD
11040 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69  ata *pTsd = sqli
11050 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b  te3ThreadData();
11060 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11070 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
11080 54 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c  Tsd && pTsd->nAl
11090 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  loc );.#endif.. 
110a0 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d   switch( pPager-
110b0 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  >state ){.    ca
110c0 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  se PAGER_RESERVE
110d0 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  D:.    case PAGE
110e0 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63  R_SYNCED: .    c
110f0 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ase PAGER_EXCLUS
11100 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IVE: {.      /* 
11110 57 65 20 69 67 6e 6f 72 65 20 61 6e 79 20 49 4f  We ignore any IO
11120 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f 63 63   errors that occ
11130 75 72 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  ur during the ro
11140 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20  llback.      ** 
11150 6f 70 65 72 61 74 69 6f 6e 2e 20 53 6f 20 64 69  operation. So di
11160 73 61 62 6c 65 20 49 4f 20 65 72 72 6f 72 20 73  sable IO error s
11170 69 6d 75 6c 61 74 69 6f 6e 20 73 6f 20 74 68 61  imulation so tha
11180 74 20 74 65 73 74 69 6e 67 0a 20 20 20 20 20 20  t testing.      
11190 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72 65 20 65 61  ** works more ea
111a0 73 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  sily..      */. 
111b0 20 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d       disable_sim
111c0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
111d0 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
111e0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
111f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 65  pPager);.      e
11200 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
11210 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
11220 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
11230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11240 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
11250 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
11260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
11270 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
11280 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Code || pPager->
11290 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
112a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
112b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 41     }.    case PA
112c0 47 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20  GER_SHARED: {.  
112d0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
112e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
112f0 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
11300 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
11310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11320 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
11330 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
11340 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
11350 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11360 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50    }.  }.  for(pP
11370 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
11380 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
11390 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
113a0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
113b0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
113c0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
113d0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
113e0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
113f0 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73  rt( !pPg->always
11400 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
11410 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
11420 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
11430 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
11440 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a  >pStmt );.    }.
11450 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 78 74  #endif.    pNext
11460 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
11470 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
11480 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52 41  (pPg);.  }.  TRA
11490 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE2("CLOSE %d\n"
114a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
114b0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
114c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
114d0 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
114e0 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67  lOpen==0 && pPag
114f0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29  er->stmtOpen==0)
11500 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
11510 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
11520 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
11530 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
11540 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
11550 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
11560 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
11570 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
11580 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
11590 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73  Close(&pPager->s
115a0 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  tfd);.  }.  sqli
115b0 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
115c0 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65  er->fd);.  /* Te
115d0 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
115e0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
115f0 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
11600 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
11610 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
11620 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
11630 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
11640 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
11650 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11660 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
11670 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65  NAGEMENT.  /* Re
11680 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 66  move the pager f
11690 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  rom the linked l
116a0 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 73 74  ist of pagers st
116b0 61 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20  arting at .  ** 
116c0 54 68 72 65 61 64 44 61 74 61 2e 70 50 61 67 65  ThreadData.pPage
116d0 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61  r if memory-mana
116e0 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65  gement is enable
116f0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
11700 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67  ager==pTsd->pPag
11710 65 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e  er ){.    pTsd->
11720 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d  pPager = pPager-
11730 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
11740 0a 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70  .    Pager *pTmp
11750 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d  ;.    for(pTmp =
11760 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70   pTsd->pPager; p
11770 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67  Tmp->pNext!=pPag
11780 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70  er; pTmp=pTmp->p
11790 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70  Next){}.    pTmp
117a0 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72  ->pNext = pPager
117b0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e  ->pNext;.  }.#en
117c0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 46 72 65  dif..  sqliteFre
117d0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
117e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
117f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
11800 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
11810 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
11820 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
11830 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
11840 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
11850 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
11860 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
11870 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
11880 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
11890 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
118a0 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
118b0 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
118c0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
118d0 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
118e0 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
118f0 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
11900 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
11910 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
11920 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
11930 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
11940 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
11950 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
11960 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
11970 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
11980 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
11990 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
119a0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
119b0 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
119c0 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
119d0 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
119e0 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
119f0 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
11a00 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
11a10 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
11a20 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
11a30 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
11a40 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
11a50 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
11a60 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
11a70 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
11a80 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
11a90 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
11aa0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
11ab0 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
11ac0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
11ad0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
11ae0 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
11af0 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
11b00 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
11b10 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
11b20 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
11b30 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
11b40 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
11b50 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
11b60 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
11b70 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
11b80 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
11b90 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
11ba0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
11bb0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
11bc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
11bd0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
11be0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
11bf0 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
11c00 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
11c10 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
11c20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
11c30 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
11c40 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
11c50 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
11c60 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
11c70 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
11c80 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
11c90 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11ca0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
11cb0 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
11cc0 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
11cd0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
11ce0 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
11cf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11d00 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
11d10 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70  .      REFINFO(p
11d20 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Pg);.    }.  }.#
11d30 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
11d40 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
11d50 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
11d60 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
11d70 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
11d80 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
11d90 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
11da0 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
11db0 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
11dc0 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
11dd0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
11de0 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
11df0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
11e00 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
11e10 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
11e20 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
11e30 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  a);.  page_ref(p
11e40 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
11e50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11e60 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
11e70 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
11e80 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
11e90 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
11ea0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
11eb0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
11ec0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
11ed0 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
11ee0 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
11ef0 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
11f00 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
11f10 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
11f20 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
11f30 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
11f40 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
11f50 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
11f60 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
11f70 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
11f80 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
11f90 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
11fa0 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
11fb0 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
11fc0 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
11fd0 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
11fe0 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
11ff0 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
12000 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
12010 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
12020 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
12030 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
12040 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
12050 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12060 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
12070 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
12080 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
12090 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
120a0 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
120b0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
120c0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
120d0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
120e0 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
120f0 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
12100 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
12110 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
12120 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
12130 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
12140 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
12150 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
12160 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
12170 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
12180 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
12190 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
121a0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
121b0 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
121c0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
121d0 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
121e0 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
121f0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
12200 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
12210 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
12220 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
12230 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
12240 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
12250 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
12260 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
12270 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
12280 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12290 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
122a0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
122b0 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
122c0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
122d0 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
122e0 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
122f0 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
12300 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
12310 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12320 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
12330 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
12340 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
12350 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12360 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
12370 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
12380 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
12390 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
123a0 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
123b0 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
123c0 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
123d0 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
123e0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
123f0 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
12400 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
12410 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
12420 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
12430 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
12440 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
12450 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
12460 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
12470 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
12480 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
12490 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
124a0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
124b0 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
124c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
124d0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
124e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
124f0 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
12500 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
12510 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
12520 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
12530 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20  alOff==jSz );.  
12540 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12550 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
12560 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
12570 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
12580 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
12590 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
125a0 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
125b0 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
125c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
125d0 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
125e0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
125f0 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
12600 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
12610 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
12620 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
12630 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
12640 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
12650 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20   rollback. .    
12660 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
12670 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
12680 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
12690 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
126a0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
126b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
126c0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
126d0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
126e0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
126f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
12700 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
12710 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12730 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
12740 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
12760 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12770 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
12780 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20  alMagic));.     
12790 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
127a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72  rn rc;.        r
127b0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
127c0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
127d0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20  ger->nRec);.    
127e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
127f0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  urn rc;..       
12800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
12810 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
12820 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12830 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
12840 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12860 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
12870 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
12880 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
12890 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
128a0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
128b0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  ->jfd, pPager->f
128c0 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20  ull_fsync);.    
128d0 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
128e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
128f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
12900 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
12910 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
12920 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
12930 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
12940 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
12950 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
12960 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
12970 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
12980 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
12990 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
129a0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
129b0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
129c0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
129d0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
129e0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
129f0 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
12a00 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
12a10 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65  lag is clear the
12a20 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  n the PgHdr.need
12a30 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d  Sync.  ** flag m
12a40 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61  ust also be clea
12a50 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e  r for all pages.
12a60 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
12a70 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e  is.  ** invarian
12a80 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a  t is true..  */.
12a90 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28    else{.    for(
12aa0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
12ab0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
12ac0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
12ad0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
12ae0 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
12af0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
12b00 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12b10 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  ced==pPager->pFi
12b20 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
12b30 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
12b40 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
12b50 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
12b60 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
12b70 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
12b80 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
12b90 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
12ba0 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
12bb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12bc0 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
12bd0 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
12be0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12bf0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
12c00 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
12c10 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
12c20 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
12c30 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
12c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12c50 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
12c60 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
12c70 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
12c80 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
12c90 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
12ca0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
12cb0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
12cc0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
12cd0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
12ce0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12cf0 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
12d00 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
12d10 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
12d20 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
12d30 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
12d40 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
12d50 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
12d60 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
12d70 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
12d80 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
12d90 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
12da0 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
12db0 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
12dc0 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
12dd0 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
12de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
12df0 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
12e00 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
12e10 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
12e20 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
12e30 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
12e40 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
12e50 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
12e60 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
12e70 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
12e80 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
12e90 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
12ea0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
12eb0 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
12ec0 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
12ed0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
12ee0 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
12ef0 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
12f00 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
12f10 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
12f20 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
12f30 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
12f40 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
12f50 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
12f60 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
12f70 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
12f80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12f90 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
12fa0 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
12fb0 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
12fc0 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
12fd0 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
12fe0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
12ff0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
13000 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
13010 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
13020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
13030 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
13040 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
13050 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
13060 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
13070 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
13080 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ek(pPager->fd, (
13090 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
130a0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
130b0 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Size);.    if( r
130c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
130d0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
130e0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
130f0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
13100 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
13110 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
13120 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
13130 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
13140 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
13150 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
13160 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
13170 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
13180 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
13190 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
131a0 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
131b0 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
131c0 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
131d0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
131e0 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
131f0 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
13200 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  ){.      CODEC(p
13210 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
13220 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
13230 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20  st->pgno, 6);.  
13240 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4f 52      TRACE3("STOR
13250 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
13260 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
13270 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
13280 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13290 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
132a0 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
132b0 41 54 41 28 70 4c 69 73 74 29 2c 0a 20 20 20 20  ATA(pList),.    
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132d0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
132e0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
132f0 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
13300 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c  PGHDR_TO_DATA(pL
13310 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ist), pList->pgn
13320 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 45 53  o, 0);.      TES
13330 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
13340 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69  Write);.    }.#i
13350 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
13360 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41   else{.      TRA
13370 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE3("NOSTORE %d 
13380 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
13390 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
133a0 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  st->pgno);.    }
133b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
133c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
133d0 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
133e0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
133f0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
13400 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
13410 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
13420 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
13430 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
13440 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
13450 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
13460 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
13470 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
13480 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
13490 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
134a0 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
134b0 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
134c0 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
134d0 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
134e0 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
134f0 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
13500 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
13510 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
13520 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
13530 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
13540 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a  ){.  PgHdr *p, *
13550 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d  pList;.  pList =
13560 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67   0;.  for(p=pPag
13570 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
13580 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
13590 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b   if( p->dirty ){
135a0 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79  .      p->pDirty
135b0 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
135c0 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d  pList = p;.    }
135d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
135e0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ist;.}../*.** Re
135f0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
13600 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
13610 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  nal on the given
13620 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74   pager..** A hot
13630 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
13640 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
13650 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a   played back..**
13660 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
13670 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
13680 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
13690 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
136a0 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
136b0 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
136c0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
136d0 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
136e0 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
136f0 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
13700 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c   name.  Just del
13710 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
13720 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
13730 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
13740 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
13750 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  f( !pPager->useJ
13760 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20  ournal ) return 
13770 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
13780 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
13790 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
137a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
137b0 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  ( sqlite3OsCheck
137c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
137d0 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75 72  ger->fd) ) retur
137e0 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 0;.  if( sqlit
137f0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
13800 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
13810 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
13820 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
13830 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  rnal);.    retur
13840 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
13850 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
13860 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
13870 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
13880 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61  he cache that ca
13890 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a  n be recycled. .
138a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
138b0 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ne may return SQ
138c0 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
138d0 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54  TE_FULL or SQLIT
138e0 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65  E_OK. It .** doe
138f0 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50  s not set the pP
13900 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61  ager->errCode va
13910 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
13920 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79  c int pager_recy
13930 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  cle(Pager *pPage
13940 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50  r, int syncOk, P
13950 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20  gHdr **ppPg){.  
13960 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70  PgHdr *pPg;.  *p
13970 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46  pPg = 0;..  /* F
13980 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
13990 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
139a0 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
139b0 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  t does not.  ** 
139c0 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
139d0 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
139e0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  he journal..  */
139f0 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d  .  pPg = pPager-
13a00 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
13a10 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
13a20 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
13a30 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
13a40 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
13a50 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f  ).  ** on the jo
13a60 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
13a70 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
13a80 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
13a90 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f   a.  ** very slo
13aa0 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
13ab0 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
13ac0 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
13ad0 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74  ometimes.  ** it
13ae0 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
13af0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
13b00 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
13b10 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20  First && syncOk 
13b20 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20  && !MEMDB){.    
13b30 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
13b40 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
13b50 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
13b60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13b70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
13b80 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
13b90 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e  {.      /* If in
13ba0 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
13bb0 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
13bc0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
13bd0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   the.      ** jo
13be0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
13bf0 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
13c00 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
13c10 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
13c20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
13c30 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
13c40 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
13c50 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
13c60 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
13c70 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
13c80 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
13c90 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
13ca0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   is.      ** tra
13cb0 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
13cc0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
13cd0 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ted)..      */. 
13ce0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
13cf0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
13d00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13d10 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
13d20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
13d30 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
13d40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13d50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
13d60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
13d70 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d  .    }.    pPg =
13d80 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
13d90 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
13da0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
13db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
13dc0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13dd0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
13de0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
13df0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
13e00 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
13e10 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ty..  */.  if( p
13e20 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
13e30 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
13e40 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
13e50 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 67  nc==0 );.    pPg
13e60 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
13e70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
13e80 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
13e90 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
13ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13eb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13ec0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
13ed0 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
13ee0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
13ef0 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
13f00 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
13f10 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
13f20 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74  k, then.  ** set
13f30 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
13f40 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
13f50 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
13f60 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
13f70 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
13f80 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
13f90 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
13fa0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
13fb0 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
13fc0 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
13fd0 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
13fe0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
13ff0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
14000 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
14010 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
14020 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
14030 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
14040 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
14050 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
14060 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
14070 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
14080 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
14090 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
140a0 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
140b0 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
140c0 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
140d0 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
140e0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
140f0 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
14100 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74  }..  /* Unlink t
14110 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d  he old page from
14120 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61   the free list a
14130 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nd the hash tabl
14140 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50  e.  */.  unlinkP
14150 61 67 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54  age(pPg);.  TEST
14160 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f  _INCR(pPager->nO
14170 76 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d  vfl);..  *ppPg =
14180 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
14190 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
141a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
141b0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72   is called to fr
141c0 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64  ee superfluous d
141d0 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
141e0 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68  ated memory.** h
141f0 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72  eld by the pager
14200 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20   system. Memory 
14210 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51  in use by any SQ
14220 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63  Lite pager alloc
14230 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
14240 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61  urrent thread ma
14250 79 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28  y be sqliteFree(
14260 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20  )ed..**.** nReq 
14270 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
14280 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
14290 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20   required. Once 
142a0 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a  this much has.**
142b0 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20   been released, 
142c0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
142d0 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65  urns. A negative
142e0 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20   value for nReq 
142f0 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73  means.** free as
14300 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
14310 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65  possible. The re
14320 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
14330 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
14340 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
14350 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
14360 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14370 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
14380 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71  ANAGEMENT.int sq
14390 6c 69 74 65 33 70 61 67 65 72 5f 72 65 6c 65 61  lite3pager_relea
143a0 73 65 5f 6d 65 6d 6f 72 79 28 69 6e 74 20 6e 52  se_memory(int nR
143b0 65 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72  eq){.  const Thr
143c0 65 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20  eadData *pTsdro 
143d0 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
143e0 61 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20  ataReadOnly();. 
143f0 20 50 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74   Pager *p;.  int
14400 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a   nReleased = 0;.
14410 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49    int i;..  /* I
14420 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c  f the the global
14430 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20   mutex is held, 
14440 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
14450 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f  becomes a.  ** o
14460 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20  -op; zero bytes 
14470 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72  of memory are fr
14480 65 65 64 2e 20 20 54 68 69 73 20 69 73 20 62 65  eed.  This is be
14490 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20  cause.  ** some 
144a0 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f  of the code invo
144b0 6b 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ked by this func
144c0 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20  tion may also.  
144d0 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** try to obtain
144e0 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75   the mutex, resu
144f0 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c  lting in a deadl
14500 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
14510 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78  sqlite3OsInMutex
14520 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  (0) ){.    retur
14530 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  n 0;.  }..  /* O
14540 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75  utermost loop ru
14550 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74  ns for at most t
14560 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46  wo iterations. F
14570 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77  irst iteration w
14580 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69  e.  ** try to fi
14590 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63  nd memory that c
145a0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77  an be released w
145b0 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66  ithout calling f
145c0 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20  sync(). Second. 
145d0 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77   ** iteration (w
145e0 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69  hich only runs i
145f0 66 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c  f the first fail
14600 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20  ed to free nReq 
14610 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65  bytes of.  ** me
14620 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74  mory) is permitt
14630 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63  ed to call fsync
14640 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63  (). This is of c
14650 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20  ourse much more 
14660 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e  .  ** expensive.
14670 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
14680 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20   i<=1; i++){..  
14690 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
146a0 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65  h all the SQLite
146b0 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62   pagers opened b
146c0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
146d0 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  read. */.    for
146e0 28 70 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65  (p=pTsdro->pPage
146f0 72 3b 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20  r; p && (nReq<0 
14700 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65  || nReleased<nRe
14710 71 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  q); p=p->pNext){
14720 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
14730 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  g;.      int rc;
14740 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  ..      /* For e
14750 61 63 68 20 70 61 67 65 72 2c 20 74 72 79 20 74  ach pager, try t
14760 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70  o free as many p
14770 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  ages as possible
14780 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20   (without .     
14790 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e   ** calling fsyn
147a0 63 28 29 20 69 66 20 74 68 69 73 20 69 73 20 74  c() if this is t
147b0 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
147c0 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d  on of the outerm
147d0 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  ost .      ** lo
147e0 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  op)..      */.  
147f0 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
14800 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65  E_OK==(rc = page
14810 72 5f 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20  r_recycle(p, i, 
14820 26 70 50 67 29 29 20 26 26 20 70 50 67 29 20 7b  &pPg)) && pPg) {
14830 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76  .        /* We'v
14840 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74  e found a page t
14850 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20  o free. At this 
14860 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68  point the page h
14870 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  as been .       
14880 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   ** removed from
14890 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74   the page hash-t
148a0 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20  able, free-list 
148b0 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20  and synced-list 
148c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69  .        ** (pFi
148d0 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69  rstSynced). It i
148e0 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61  s still in the a
148f0 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20  ll pages (pAll) 
14900 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
14910 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * Remove it from
14920 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72   this list befor
14930 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20  e freeing..     
14940 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
14950 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65   Todo: Check the
14960 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73   Pager.pStmt lis
14970 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
14980 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20  his is Ok. It . 
14990 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62         ** probab
149a0 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20  ly is though..  
149b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
149c0 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20   PgHdr *pTmp;.  
149d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
149e0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  g );.        pag
149f0 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
14a00 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
14a10 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
14a20 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
14a30 20 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70       p->pAll = p
14a40 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
14a50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14a60 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70         for( pTmp
14a70 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e  =p->pAll; pTmp->
14a80 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70  pNextAll!=pPg; p
14a90 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41  Tmp=pTmp->pNextA
14aa0 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20  ll ){}.         
14ab0 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20   pTmp->pNextAll 
14ac0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
14ad0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14ae0 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20     nReleased += 
14af0 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28  sqliteAllocSize(
14b00 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pPg);.        sq
14b10 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
14b20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
14b30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14b40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  ){.        /* An
14b50 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77   error occured w
14b60 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
14b70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14b80 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  le or .        *
14b90 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67  * journal in pag
14ba0 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68  er_recycle(). Th
14bb0 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72  e error is not r
14bc0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a  eturned to the .
14bd0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65          ** calle
14be0 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  r of this functi
14bf0 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74  on. Instead, set
14c00 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   the Pager.errCo
14c10 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20  de variable..   
14c20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f       ** The erro
14c30 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  r will be return
14c40 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 28  ed to the user (
14c50 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65  or users, in the
14c60 20 63 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a   case .        *
14c70 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70 61  * of a shared pa
14c80 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74 68  ger cache) of th
14c90 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63  e pager for whic
14ca0 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  h the error occu
14cb0 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  red..        */.
14cc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14cd0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
14ce0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46   || rc==SQLITE_F
14cf0 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ULL );.        a
14d00 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e  ssert( p->state>
14d10 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
14d20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  );.        pager
14d30 5f 65 72 72 6f 72 28 70 2c 20 72 63 29 3b 0a 20  _error(p, rc);. 
14d40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14d50 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65  ..  return nRele
14d60 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ased;.}.#endif /
14d70 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
14d80 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
14d90 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  T */../*.** Acqu
14da0 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ire a page..**.*
14db0 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  * A read lock on
14dc0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
14dd0 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20  s obtained when 
14de0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
14df0 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20  s acquired. .** 
14e00 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69  This read lock i
14e10 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74  s dropped when t
14e20 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  he last page is 
14e30 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
14e40 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72  A _get works for
14e50 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
14e60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
14e70 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
14e80 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
14e90 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
14ea0 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
14eb0 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
14ec0 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
14ed0 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
14ee0 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
14ef0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
14f00 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
14f10 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
14f20 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
14f30 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
14f40 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
14f50 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
14f60 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
14f70 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
14f80 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
14f90 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
14fa0 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
14fb0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
14fc0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
14fd0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
14fe0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
14ff0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
15000 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
15010 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
15020 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
15030 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
15040 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b  outine and _look
15050 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
15060 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
15070 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
15080 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
15090 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
150a0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
150b0 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
150c0 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
150d0 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
150e0 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29  hereas _lookup()
150f0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
15100 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
15110 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
15120 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
15130 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
15140 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
15150 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
15160 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
15170 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
15180 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f  ry..** Since _lo
15190 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
151a0 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
151b0 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
151c0 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
151d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
151e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
151f0 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70  ger_get(Pager *p
15200 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
15210 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29  , void **ppPage)
15220 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
15230 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
15240 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
15250 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
15260 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
15270 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
15280 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65  .  ** number gre
15290 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
152a0 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75  or zero, is requ
152b0 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ested..  */.  if
152c0 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
152d0 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30  _PGNO || pgno==0
152e0 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
152f0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
15300 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
15310 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
15320 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  T;.  }..  /* Mak
15330 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
15340 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
15350 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
15360 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67   .  assert( pPag
15370 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  er!=0 );.  *ppPa
15380 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
15390 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
153a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
153b0 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
153c0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
153d0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
153e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
153f0 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
15400 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20   accessed, then 
15410 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63  get a SHARED loc
15420 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61  k.  ** on the da
15430 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
15440 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
15450 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44  nRef==0 && !MEMD
15460 42 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  B ){.    if( !pP
15470 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
15480 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
15490 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
154a0 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
154b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
154c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
154d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
154e0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
154f0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
15500 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
15510 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
15520 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
15530 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
15540 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
15550 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
15560 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
15570 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
15580 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
15590 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
155a0 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f      if( hasHotJo
155b0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b  urnal(pPager) ){
155c0 0a 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  .       /* Get a
155d0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
155e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
155f0 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
15600 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
15610 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
15620 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
15630 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
15640 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
15650 6f 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  o the.       ** 
15660 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
15670 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
15680 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
15690 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
156a0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
156b0 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
156c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
156d0 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
156e0 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61  the.       ** da
156f0 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74  tabase is safe t
15700 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69  o read while thi
15710 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  s process is sti
15720 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20  ll rolling it . 
15730 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
15740 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
15750 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
15760 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
15770 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
15780 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  t requested, the
15790 0a 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e  .       ** secon
157a0 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
157b0 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
157c0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
157d0 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
157e0 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f  ** obtain it's o
157f0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
15800 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
15810 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a  e file..       *
15820 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
15830 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
15840 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
15850 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
15860 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15870 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71  K ){.         sq
15880 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
15890 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
158a0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61  K);.         pPa
158b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
158c0 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  ER_UNLOCK;.     
158d0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
158e0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
158f0 63 29 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  c);.       }.   
15900 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
15910 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
15920 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  IVE;..       /* 
15930 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
15940 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
15950 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
15960 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
15970 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
15980 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
15990 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
159a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a      **.       **
159b0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
159c0 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
159d0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
159e0 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
159f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
15a00 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75   is never open u
15a10 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64  nless the main d
15a20 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
15a30 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77  ds.       ** a w
15a40 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68  rite lock, so th
15a50 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
15a60 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f   chance of two o
15a70 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a  r more.       **
15a80 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
15a90 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
15aa0 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
15ab0 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
15ac0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15ad0 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61  OpenReadOnly(pPa
15ae0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
15af0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
15b00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15b10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15b20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
15b30 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
15b40 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  O_LOCK);.       
15b50 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
15b60 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
15b70 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15b80 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
15b90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
15ba0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
15bb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50 61   = 1;.       pPa
15bc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
15bd0 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ted = 0;.       
15be0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15bf0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  ff = 0;.       p
15c00 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
15c10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61   = 0;.       pPa
15c20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
15c30 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  = 0;..       /* 
15c40 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
15c50 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
15c60 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
15c70 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
15c80 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
15c90 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
15ca0 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  lock..       */.
15cb0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
15cc0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
15cd0 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  r);.       if( r
15ce0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15cf0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15d00 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
15d10 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
15d20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
15d30 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
15d40 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
15d50 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f  page in cache */
15d60 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
15d70 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
15d80 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d  pgno);.    if( M
15d90 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
15da0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
15db0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
15dc0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
15dd0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
15de0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d  .  }.  if( pPg==
15df0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
15e00 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
15e10 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67  s not in the pag
15e20 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
15e30 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f  int h;.    TEST_
15e40 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
15e50 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ss);.    if( pPa
15e60 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65  ger->nPage<pPage
15e70 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61  r->mxPage || pPa
15e80 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c  ger->pFirst==0 |
15e90 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  | MEMDB ){.     
15ea0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77   /* Create a new
15eb0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70   page */.      p
15ec0 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  Pg = sqliteMallo
15ed0 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50  cRaw( sizeof(*pP
15ee0 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67  g) + pPager->pag
15ef0 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  eSize.          
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
15f20 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
15f30 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
15f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f50 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28   + MEMDB*sizeof(
15f60 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20  PgHistory) );.  
15f70 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
15f80 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
15f90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15fa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
15fb0 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65  set(pPg, 0, size
15fc0 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20  of(*pPg));.     
15fd0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
15fe0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
15ff0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
16000 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65  pPager), 0, size
16010 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a  of(PgHistory));.
16020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
16030 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
16040 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  er;.      pPg->p
16050 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
16060 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50  ->pAll;.      pP
16070 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
16080 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
16090 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
160a0 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
160b0 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67  >pPager->nMaxPag
160c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
160d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61  ert( pPager->nMa
160e0 78 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e  xPage==(pPager->
160f0 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20  nPage-1) );.    
16100 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78      pPager->nMax
16110 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Page++;.      }.
16120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16130 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79   rc = pager_recy
16140 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26  cle(pPager, 1, &
16150 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
16160 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16170 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16180 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
16190 20 20 61 73 73 65 72 74 28 70 50 67 29 20 3b 0a    assert(pPg) ;.
161a0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
161b0 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
161c0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
161d0 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
161e0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
161f0 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
16200 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d   sqlite3CheckMem
16210 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ory(pPager->aInJ
16220 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b  ournal, pgno/8);
16230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16240 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
16250 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  en );.      pPg-
16260 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50  >inJournal = (pP
16270 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
16280 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
16290 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
162a0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
162b0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 0;.    }else
162c0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
162d0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
162e0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
162f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
16300 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
16310 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  mt && (int)pgno<
16320 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
16330 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  e.             &
16340 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  & (pPager->aInSt
16350 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  mt[pgno/8] & (1<
16360 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29  <(pgno&7)))!=0 )
16370 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  {.      page_add
16380 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
16390 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
163a0 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65       page_remove
163b0 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
163c0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
163d0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
163e0 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20      pPg->nRef = 
163f0 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70  1;.    REFINFO(p
16400 50 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72  Pg);..    pPager
16410 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66  ->nRef++;.    if
16420 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  ( pPager->nExtra
16430 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
16440 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
16450 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20  A(pPg, pPager), 
16460 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
16470 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  a);.    }.    if
16480 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
16490 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
164a0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
164b0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
164c0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50  );.      rc = pP
164d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
164e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
164f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f      }..    /* Po
16500 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20  pulate the page 
16510 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65  with data, eithe
16520 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f  r by reading fro
16530 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  m the database. 
16540 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62     ** file, or b
16550 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e  y setting the en
16560 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72  tire page to zer
16570 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
16580 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ( sqlite3pager_p
16590 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
165a0 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45  <(int)pgno || ME
165b0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  MDB ){.      mem
165c0 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
165d0 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
165e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
165f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
16600 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20  ssert( MEMDB==0 
16610 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
16620 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
16630 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
16640 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
16650 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
16660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16670 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16680 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
16690 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
166a0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20  _TO_DATA(pPg),. 
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
166d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
166e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
166f0 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20 70  ACE3("FETCH %d p
16700 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
16710 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
16720 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f  >pgno);.      CO
16730 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
16740 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
16750 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
16760 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16770 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16780 20 20 69 36 34 20 66 69 6c 65 53 69 7a 65 3b 0a    i64 fileSize;.
16790 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 32 20          int rc2 
167a0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
167b0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
167c0 26 66 69 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  &fileSize);.    
167d0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
167e0 49 54 45 5f 4f 4b 20 7c 7c 20 66 69 6c 65 53 69  ITE_OK || fileSi
167f0 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72 2d  ze>=pgno*pPager-
16800 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 09 20 20  >pageSize ){..  
16810 2f 2a 20 41 6e 20 49 4f 20 65 72 72 6f 72 20 6f  /* An IO error o
16820 63 63 75 72 65 64 20 69 6e 20 6f 6e 65 20 6f 66  ccured in one of
16830 20 74 68 65 20 74 68 65 20 73 71 6c 69 74 65 33   the the sqlite3
16840 4f 73 53 65 65 6b 28 29 20 6f 72 0a 20 20 20 20  OsSeek() or.    
16850 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
16860 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 73 20 61  OsRead() calls a
16870 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  bove. */.       
16880 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30     pPg->pgno = 0
16890 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
168a0 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50  te3pager_unref(P
168b0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
168c0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
168d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
168e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
168f0 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65    clear_simulate
16900 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20  d_io_error();.  
16910 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
16920 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16930 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
16940 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
16950 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
16960 20 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43          TEST_INC
16970 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
16980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16990 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65  .    /* Link the
169a0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
169b0 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a  age hash table *
169c0 2f 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f  /.    h = pager_
169d0 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20  hash(pgno);.    
169e0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
169f0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
16a00 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
16a10 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
16a20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
16a30 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
16a40 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
16a50 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
16a60 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
16a70 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
16a80 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
16a90 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
16aa0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
16ab0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
16ac0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
16ad0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
16ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
16af0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
16b00 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
16b10 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54   cache. */.    T
16b20 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
16b30 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65  >nHit);.    page
16b40 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
16b50 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52   *ppPage = PGHDR
16b60 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
16b70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16b80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
16b90 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
16ba0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
16bb0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
16bc0 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
16bd0 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
16be0 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
16bf0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
16c00 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
16c10 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
16c20 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
16c30 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
16c40 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20  e3pager_get().  
16c50 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
16c60 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
16c70 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
16c80 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73  e3pager_get() is
16c90 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
16ca0 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
16cb0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
16cc0 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
16cd0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
16ce0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
16cf0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
16d00 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
16d10 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
16d20 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
16d30 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
16d40 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
16d50 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ened..*/.void *s
16d60 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
16d70 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
16d80 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
16d90 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
16da0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
16db0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
16dc0 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  no!=0 );.  if( p
16dd0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
16de0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
16df0 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
16e00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
16e10 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65    }.  pPg = page
16e20 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
16e30 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
16e40 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
16e50 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
16e60 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52  ;.  return PGHDR
16e70 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d  _TO_DATA(pPg);.}
16e80 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
16e90 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
16ea0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16eb0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
16ec0 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
16ed0 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
16ee0 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
16ef0 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
16f00 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
16f10 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
16f20 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
16f30 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
16f40 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
16f50 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16f60 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
16f70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
16f80 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a  ger_unref(void *
16f90 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
16fa0 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72  *pPg;..  /* Decr
16fb0 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
16fc0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68  nce count for th
16fd0 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70  is page.  */.  p
16fe0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
16ff0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73  DR(pData);.  ass
17000 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
17010 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d   );.  pPg->nRef-
17020 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  -;.  REFINFO(pPg
17030 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
17040 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  (pPg);..  /* Whe
17050 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
17060 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20  references to a 
17070 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61  page reach 0, ca
17080 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74  ll the.  ** dest
17090 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74  ructor and add t
170a0 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
170b0 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  reelist..  */.  
170c0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
170d0 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
170e0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65  Pager;.    pPage
170f0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
17100 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
17110 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ree = 0;.    pPg
17120 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
17130 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20  ager->pLast;.   
17140 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
17150 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
17160 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
17170 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
17180 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
17190 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65  = pPg;.    }else
171a0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
171b0 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
171c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
171d0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20  >needSync==0 && 
171e0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
171f0 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nced==0 ){.     
17200 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
17210 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20  ynced = pPg;.   
17220 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
17230 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
17240 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
17250 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
17260 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17270 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ize);.    }.  . 
17280 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70     /* When all p
17290 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66  ages reach the f
172a0 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68  reelist, drop th
172b0 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d  e read lock from
172c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
172d0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
172e0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  /.    pPager->nR
172f0 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ef--;.    assert
17300 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d  ( pPager->nRef>=
17310 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
17320 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
17330 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
17340 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
17350 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
17360 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17370 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
17380 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  te a journal fil
17390 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54  e for pPager.  T
173a0 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65  here should alre
173b0 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
173c0 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56  D.** or EXCLUSIV
173d0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
173e0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e  tabase file when
173f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17400 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
17410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
17420 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20  if everything.  
17430 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
17440 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65  code and release
17450 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f   the.** write lo
17460 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  ck if anything g
17470 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
17480 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
17490 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
174a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
174b0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
174c0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
174d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
174e0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
174f0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
17500 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
17510 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  en==0 );.  asser
17520 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
17530 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
17540 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
17550 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71  urnal==0 );.  sq
17560 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
17570 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
17580 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
17590 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  al = sqliteMallo
175a0 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
175b0 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
175c0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
175d0 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nal==0 ){.    rc
175e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
175f0 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
17600 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
17610 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
17620 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
17630 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ive(pPager->zJou
17640 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
17650 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17670 20 20 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d       pPager->tem
17680 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72  pFile);.  pPager
17690 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
176a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
176b0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
176c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
176d0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
176e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
176f0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
17700 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
17710 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46  .  sqlite3OsSetF
17720 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  ullSync(pPager->
17730 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  jfd, pPager->ful
17740 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69  l_fsync);.  sqli
17750 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63  te3OsSetFullSync
17760 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
17770 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29  ger->full_fsync)
17780 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  ;.  sqlite3OsOpe
17790 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65  nDirectory(pPage
177a0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
177b0 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70  zDirectory);.  p
177c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
177d0 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72  en = 1;.  pPager
177e0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
177f0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
17800 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
17810 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
17820 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50  llback = 0;.  pP
17830 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
17840 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
17850 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  rCode ){.    rc 
17860 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
17870 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  e;.    goto fail
17880 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
17890 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  al;.  }.  pPager
178a0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
178b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
178c0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
178d0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
178e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
178f0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72  tmtAutoopen && r
17900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17920 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e  pager_stmt_begin
17930 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
17940 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17950 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
17960 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20  NOMEM ){.    rc 
17970 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
17980 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
17990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
179a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
179b0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
179c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
179d0 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f   rc;..failed_to_
179e0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20  open_journal:.  
179f0 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
17a00 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
17a10 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
17a20 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  rnal = 0;.  if( 
17a30 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
17a40 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
17a50 69 73 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63 28  is was a malloc(
17a60 29 20 66 61 69 6c 75 72 65 2c 20 74 68 65 6e 20  ) failure, then 
17a70 77 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  we will not be c
17a80 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65 72  losing the pager
17a90 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f  .    ** file. So
17aa0 20 64 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75 72   delete any jour
17ab0 6e 61 6c 20 66 69 6c 65 20 77 65 20 6d 61 79 20  nal file we may 
17ac0 68 61 76 65 20 6a 75 73 74 20 63 72 65 61 74 65  have just create
17ad0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  d. Otherwise,.  
17ae0 20 20 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 20    ** the system 
17af0 77 69 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73 65  will get confuse
17b00 64 2c 20 77 65 20 68 61 76 65 20 61 20 72 65 61  d, we have a rea
17b10 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  d-lock on the fi
17b20 6c 65 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a 20  le and a.    ** 
17b30 6d 79 73 74 65 72 69 6f 75 73 20 6a 6f 75 72 6e  mysterious journ
17b40 61 6c 20 68 61 73 20 61 70 70 65 61 72 65 64 20  al has appeared 
17b50 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
17b60 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  m..    */.    sq
17b70 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
17b80 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
17b90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
17ba0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
17bb0 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
17bc0 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
17bd0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
17be0 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LOCK;.  }.  retu
17bf0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17c00 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
17c10 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17c20 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
17c30 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
17c40 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
17c50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
17c60 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
17c70 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
17c80 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  it() is called..
17c90 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
17ca0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
17cb0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
17cc0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
17cd0 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  close() is calle
17ce0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
17cf0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20  e3pager_unref() 
17d00 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
17d10 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
17d20 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
17d30 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
17d40 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
17d50 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
17d60 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
17d70 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
17d80 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
17d90 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
17da0 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
17db0 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
17dc0 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
17dd0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
17de0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
17df0 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
17e00 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
17e10 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
17e20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
17e30 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
17e40 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
17e50 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
17e60 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
17e70 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
17e80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17e90 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
17ea0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
17eb0 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
17ec0 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
17ed0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
17ee0 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
17ef0 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
17f00 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
17f10 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
17f20 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
17f30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
17f40 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
17f50 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
17f60 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
17f70 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
17f80 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
17f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
17fa0 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
17fb0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
17fc0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
17fd0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
17fe0 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
17ff0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
18000 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
18010 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
18020 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
18030 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
18040 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
18050 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
18060 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
18070 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
18080 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
18090 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
180a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
180b0 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20  ager_begin(void 
180c0 2a 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46 6c  *pData, int exFl
180d0 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ag){.  PgHdr *pP
180e0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
180f0 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
18100 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
18110 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
18120 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18130 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
18140 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
18150 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
18160 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
18170 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
18180 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
18190 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
181a0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
181b0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
181c0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
181d0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
181e0 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
181f0 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
18200 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
18210 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
18220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
18230 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
18240 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
18250 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
18260 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18270 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18280 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
18290 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
182a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46  .        if( exF
182b0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
182c0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
182d0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
182e0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
182f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18300 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
18310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18320 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18340 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
18350 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  he = 0;.      TR
18360 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE2("TRANSACTIO
18370 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
18380 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
18390 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
183a0 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
183b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
183c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
183d0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
183e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
183f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18400 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18410 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
18420 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
18430 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
18440 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
18450 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
18460 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
18470 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
18480 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
18490 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
184a0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
184b0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
184c0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
184d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
184e0 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
184f0 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
18500 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
18510 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  res a RESERVED l
18520 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
18530 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53  ase.  If the RES
18540 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  ERVED.** lock co
18550 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69  uld not be acqui
18560 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
18570 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
18580 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63  _BUSY.  The.** c
18590 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d  alling routine m
185a0 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68  ust check for th
185b0 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  at return value 
185c0 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
185d0 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20  ot to.** change 
185e0 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
185f0 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  til this routine
18600 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
18610 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
18620 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
18630 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74  uld not be writt
18640 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64  en because the d
18650 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20  isk is full,.** 
18660 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
18670 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
18680 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61  _FULL and does a
18690 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c  n immediate roll
186a0 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62  back..** All sub
186b0 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74  sequent write at
186c0 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75  tempts also retu
186d0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75  rn SQLITE_FULL u
186e0 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ntil there.** is
186f0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
18700 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e3pager_commit()
18710 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67 65 72   or sqlite3pager
18720 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  _rollback() to.*
18730 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20  * reset..*/.int 
18740 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
18750 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  te(void *pData){
18760 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
18770 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
18780 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
18790 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
187a0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
187b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
187c0 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72   Check for error
187d0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
187e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20  ger->errCode ){ 
187f0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
18800 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
18810 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
18820 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
18830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
18840 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  M;.  }..  assert
18850 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
18860 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b  ster );..  CHECK
18870 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
18880 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
18890 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
188a0 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
188b0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
188c0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
188d0 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
188e0 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
188f0 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64  y..  */.  pPg->d
18900 69 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20  irty = 1;.  if( 
18910 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
18920 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c  & (pPg->inStmt |
18930 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  | pPager->stmtIn
18940 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  Use==0) ){.    p
18950 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
18960 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
18970 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
18980 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
18990 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
189a0 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
189b0 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
189c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
189d0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
189e0 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
189f0 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
18a00 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
18a10 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
18a20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
18a30 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
18a40 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
18a50 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
18a60 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
18a70 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
18a80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
18a90 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
18aa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
18ab0 61 67 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61  ager_begin(pData
18ac0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
18ad0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18ae0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18af0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18b00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
18b10 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
18b20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
18b30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18b40 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
18b50 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
18b60 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
18b70 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
18b80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18b90 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
18ba0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
18bb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
18bc0 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70  ournalOpen || !p
18bd0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
18be0 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
18bf0 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
18c00 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74  .  .    /* The t
18c10 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
18c20 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e  al now exists an
18c30 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45  d we have a RESE
18c40 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a  RVED or an.    *
18c50 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
18c60 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
18c70 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69  abase file.  Wri
18c80 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
18c90 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  age to.    ** th
18ca0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
18cb0 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e  urnal if it is n
18cc0 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
18cd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
18ce0 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
18cf0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65   && (pPager->use
18d00 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42  Journal || MEMDB
18d10 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ) ){.      if( (
18d20 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
18d30 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
18d40 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
18d50 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  nt szPg;.       
18d60 20 75 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20   u32 saved;.    
18d70 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
18d80 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73  .          PgHis
18d90 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
18da0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
18db0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
18dc0 20 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52      TRACE3("JOUR
18dd0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
18de0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
18df0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
18e00 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
18e10 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
18e20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
18e30 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
18e40 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
18e50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
18e60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
18e70 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
18e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
18e90 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
18ea0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
18eb0 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
18ec0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
18ed0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
18ee0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
18ef0 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
18f00 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
18f10 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
18f20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
18f30 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
18f40 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
18f50 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
18f60 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
18f70 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
18f80 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20  rifies.         
18f90 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
18fa0 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ot. */.         
18fb0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
18fc0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
18fd0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
18fe0 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61         CODEC(pPa
18ff0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
19000 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
19010 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
19020 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
19030 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20   pData);.       
19040 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32     saved = *(u32
19050 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  *)PGHDR_TO_EXTRA
19060 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
19070 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32           store32
19080 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c  bits(cksum, pPg,
19090 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
190a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  e);.          sz
190b0 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg = pPager->pag
190c0 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20  eSize+8;.       
190d0 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70     store32bits(p
190e0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d  Pg->pgno, pPg, -
190f0 34 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 72  4);..          r
19100 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
19110 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
19120 26 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b  &((char*)pData)[
19130 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20  -4], szPg);.    
19140 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
19150 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67  urnalOff += szPg
19160 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
19170 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E4("JOURNAL %d p
19180 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
19190 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
191a0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
191b0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
191c0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
191d0 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 43  nc);.          C
191e0 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
191f0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30  ta, pPg->pgno, 0
19200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75  );.          *(u
19210 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
19220 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 20  RA(pPg, pPager) 
19230 3d 20 73 61 76 65 64 3b 0a 0a 09 20 20 2f 2a 20  = saved;...  /* 
19240 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
19250 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20  ured writing to 
19260 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19270 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 20  . The .         
19280 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
19290 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
192a0 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72  ack by the layer
192b0 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
192c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
192d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
192e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
192f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19300 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
19310 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
19320 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
19330 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
19340 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
19350 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
19360 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
19370 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
19380 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
19390 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
193a0 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
193b0 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  oSync;.         
193c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
193d0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
193e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
193f0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
19400 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
19410 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
19420 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
19430 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
19440 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19450 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
19460 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  e{.        pPg->
19470 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
19480 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
19490 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
194a0 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54  oSync;.        T
194b0 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64  RACE4("APPEND %d
194c0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
194d0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
194e0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
194f0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
19500 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
19510 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
19520 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
19530 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
19540 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
19550 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
19560 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
19570 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
19580 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
19590 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
195a0 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
195b0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
195c0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
195d0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
195e0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
195f0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
19600 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
19610 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
19620 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
19630 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
19640 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
19650 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
19660 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
19670 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
19680 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
19690 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
196a0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
196b0 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
196c0 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
196d0 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
196e0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ize ){.      ass
196f0 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
19700 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
19710 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
19720 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
19730 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
19740 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
19750 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
19760 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
19770 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
19780 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74  sert( pHist->pSt
19790 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt==0 );.       
197a0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
197b0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
197c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
197d0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
197e0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
197f0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
19800 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  y(pHist->pStmt, 
19810 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
19820 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
19830 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
19840 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
19850 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
19860 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
19870 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
19880 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
19890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
198a0 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e  tore32bits(pPg->
198b0 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a  pgno, pPg, -4);.
198c0 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50          CODEC(pP
198d0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
198e0 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
198f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19900 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
19910 73 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44 61  stfd,((char*)pDa
19920 74 61 29 2d 34 2c 0a 20 20 20 20 20 20 20 20 20  ta)-4,.         
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19940 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
19950 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20  geSize+4);.     
19960 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d     TRACE3("STMT-
19970 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
19980 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
19990 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
199a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  o);.        CODE
199b0 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
199c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a   pPg->pgno, 0);.
199d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
199e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
199f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19a00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19a10 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
19a20 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  NRec++;.        
19a30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19a40 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
19a50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
19a60 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
19a70 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
19a80 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a  gno&7);.      }.
19a90 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
19aa0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
19ab0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
19ac0 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
19ad0 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
19ae0 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
19af0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
19b00 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  <(int)pPg->pgno 
19b10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
19b20 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
19b30 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  o;.    if( !MEMD
19b40 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  B && pPager->dbS
19b50 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize==PENDING_BYT
19b60 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
19b70 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
19b80 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20  er->dbSize++;.  
19b90 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19ba0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19bb0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
19bc0 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
19bd0 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
19be0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
19bf0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70  d.** to sqlite3p
19c00 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49  ager_write().  I
19c10 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
19c20 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
19c30 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
19c40 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
19c50 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
19c60 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
19c70 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
19c80 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64  iswriteable(void
19c90 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
19ca0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
19cb0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
19cc0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72   return pPg->dir
19cd0 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ty;.}.#endif..#i
19ce0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19cf0 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52  T_VACUUM./*.** R
19d00 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
19d10 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  nt of a single p
19d20 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66  age with the inf
19d30 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
19d40 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  third.** argumen
19d50 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
19d60 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65  3pager_overwrite
19d70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19d80 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
19d90 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20  *pData){.  void 
19da0 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63  *pPage;.  int rc
19db0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
19dc0 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
19dd0 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29  r, pgno, &pPage)
19de0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19df0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
19e00 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
19e10 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
19e20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19e30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
19e40 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c  py(pPage, pData,
19e50 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19e60 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
19e70 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
19e80 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
19e90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
19ea0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
19eb0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
19ec0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
19ed0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
19ee0 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
19ef0 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
19f00 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70  ation on page "p
19f10 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65  gno" back to the
19f20 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
19f30 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
19f40 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
19f50 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
19f60 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
19f70 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
19f80 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
19f90 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
19fa0 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
19fb0 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
19fc0 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
19fd0 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
19fe0 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
19ff0 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
1a000 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
1a010 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
1a020 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
1a030 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
1a040 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
1a050 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  * sqlite3pager_d
1a060 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62  ont_rollback() b
1a070 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
1a080 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
1a090 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
1a0a0 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
1a0b0 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
1a0c0 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
1a0d0 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
1a0e0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1a0f0 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
1a100 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
1a110 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
1a120 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
1a130 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70  alls to sqlite3p
1a140 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
1a150 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
1a160 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
1a170 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
1a180 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
1a190 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
1a1a0 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
1a1b0 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
1a1c0 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
1a1d0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
1a1e0 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
1a1f0 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
1a200 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
1a210 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
1a220 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
1a230 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
1a240 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
1a250 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
1a260 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
1a270 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
1a280 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
1a290 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
1a2a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1a2b0 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
1a2c0 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e  used,.** the don
1a2d0 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  t_rollback() rou
1a2e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1a2f0 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
1a300 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a   page contains.*
1a310 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  * critical data,
1a320 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
1a330 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
1a340 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  s rolled back in
1a350 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65   spite.** of the
1a360 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
1a370 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   call..*/.void s
1a380 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
1a390 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  _write(Pager *pP
1a3a0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
1a3b0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1a3c0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72  .  if( MEMDB ) r
1a3d0 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20  eturn;..  pPg = 
1a3e0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1a3f0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50  ger, pgno);.  pP
1a400 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1a410 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  k = 1;.  if( pPg
1a420 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20 26   && pPg->dirty &
1a430 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  & !pPager->stmtI
1a440 6e 55 73 65 20 29 7b 0a 20 20 20 20 69 66 28 20  nUse ){.    if( 
1a450 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1a460 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
1a470 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
1a480 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
1a490 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1a4a0 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
1a4b0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1a4c0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
1a4d0 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
1a4e0 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
1a4f0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
1a500 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1a510 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
1a520 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
1a530 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
1a540 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
1a550 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
1a560 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1a570 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
1a580 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
1a590 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
1a5a0 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
1a5b0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
1a5c0 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
1a5d0 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
1a5e0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
1a5f0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
1a600 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
1a610 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
1a620 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
1a630 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
1a640 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
1a650 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1a660 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
1a670 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
1a680 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1a690 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a6a0 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57    TRACE3("DONT_W
1a6b0 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
1a6c0 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47  %d\n", pgno, PAG
1a6d0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1a6e0 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
1a6f0 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
1a700 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1a710 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
1a720 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1a730 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
1a740 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1a750 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1a760 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1a770 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1a780 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
1a790 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
1a7a0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
1a7b0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1a7c0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1a7d0 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
1a7e0 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1a7f0 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
1a800 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
1a810 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
1a820 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
1a830 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nal..*/.void sql
1a840 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
1a850 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44  ollback(void *pD
1a860 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
1a870 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1a880 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
1a890 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1a8a0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28  ->pPager;..  if(
1a8b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1a8c0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1a8d0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1a8e0 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75  alOpen==0 ) retu
1a8f0 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61  rn;.  if( pPg->a
1a900 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1a910 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1a920 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42  ollback || MEMDB
1a930 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1a940 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
1a950 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1a960 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1a970 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1a980 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a990 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
1a9a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1a9b0 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
1a9c0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1a9d0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50  >pgno&7);.    pP
1a9e0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1a9f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1aa00 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1aa10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1aa20 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
1aa30 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1aa40 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67  no&7);.      pag
1aa50 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
1aa60 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
1aa70 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
1aa80 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64  ROLLBACK page %d
1aa90 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
1aaa0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
1aab0 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66  ager));.  }.  if
1aac0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1aad0 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53  Use && !pPg->inS
1aae0 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  tmt && (int)pPg-
1aaf0 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
1ab00 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  tmtSize ){.    a
1ab10 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1ab20 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
1ab30 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1ab40 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
1ab50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ab60 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
1ab70 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1ab80 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1ab90 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1aba0 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61  o&7);.    page_a
1abb0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1abc0 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69  pPg);.  }.}...#i
1abd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1abe0 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
1abf0 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f   Clear a PgHisto
1ac00 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  ry block.*/.stat
1ac10 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73  ic void clearHis
1ac20 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a  tory(PgHistory *
1ac30 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pHist){.  sqlite
1ac40 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69  Free(pHist->pOri
1ac50 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  g);.  sqliteFree
1ac60 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
1ac70 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
1ac80 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74   0;.  pHist->pSt
1ac90 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a  mt = 0;.}.#else.
1aca0 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73  #define clearHis
1acb0 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a  tory(x).#endif..
1acc0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
1acd0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1ace0 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
1acf0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1ad00 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1ad10 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
1ad20 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
1ad30 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
1ad40 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
1ad50 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1ad60 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
1ad70 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
1ad80 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
1ad90 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1ada0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1adb0 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  _commit(Pager *p
1adc0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1add0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1ade0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1adf0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
1ae00 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1ae10 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
1ae20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
1ae30 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
1ae40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ae50 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  E_ERROR;.  }.  T
1ae60 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64  RACE2("COMMIT %d
1ae70 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1ae80 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
1ae90 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  DB ){.    pPg = 
1aea0 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
1aeb0 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
1aec0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50  );.    while( pP
1aed0 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  g ){.      clear
1aee0 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
1aef0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1af00 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  r));.      pPg->
1af10 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
1af20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1af30 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1af40 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
1af50 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
1af60 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1af70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
1af80 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
1af90 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
1afa0 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67  EBUG.    for(pPg
1afb0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1afc0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1afd0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
1afe0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
1aff0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
1b000 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
1b010 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
1b020 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1b030 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1b040 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
1b050 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b060 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
1b070 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1b080 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1b090 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1b0a0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1b0b0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
1b0c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b0d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
1b0e0 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a  irtyCache==0 ){.
1b0f0 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c      /* Exit earl
1b100 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  y (without doing
1b110 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d   the time-consum
1b120 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  ing sqlite3OsSyn
1b130 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a  c() calls).    *
1b140 2a 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20  * if there have 
1b150 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
1b160 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b170 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
1b180 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1b190 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
1b1a0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
1b1b0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1b1c0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1b1d0 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ze = -1;.    ret
1b1e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
1b1f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1b200 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
1b210 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1b220 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20 30 2c  _sync(pPager, 0,
1b230 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
1b240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b250 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
1b260 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1b270 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1b280 7a 65 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  ze = -1;.  }.  r
1b290 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b2a0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
1b2b0 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
1b2c0 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
1b2d0 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
1b2e0 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  D mode..** All i
1b2f0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
1b300 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
1b310 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
1b320 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
1b330 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
1b340 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
1b350 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
1b360 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
1b370 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
1b380 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
1b390 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
1b3a0 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
1b3b0 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  l (SQLITE_PROTOC
1b3c0 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  OL) or unless so
1b3d0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
1b3e0 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
1b3f0 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
1b400 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
1b410 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
1b420 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
1b430 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
1b440 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
1b450 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
1b460 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
1b470 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
1b480 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
1b490 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
1b4a0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1b4b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
1b4c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
1b4d0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
1b4e0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1b4f0 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41    TRACE2("ROLLBA
1b500 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
1b510 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
1b520 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50  ( MEMDB ){.    P
1b530 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
1b540 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
1b550 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
1b560 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
1b570 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
1b580 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c    assert( !p->al
1b590 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
1b5a0 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69        if( !p->di
1b5b0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
1b5c0 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
1b5d0 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
1b5e0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
1b5f0 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
1b600 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
1b610 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
1b620 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
1b630 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  ))->pStmt );.   
1b640 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1b650 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48       }..      pH
1b660 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1b670 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a  IST(p, pPager);.
1b680 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
1b690 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
1b6a0 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
1b6b0 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74  O_DATA(p), pHist
1b6c0 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d  ->pOrig, pPager-
1b6d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1b6e0 20 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c 4c      TRACE3("ROLL
1b6f0 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20  BACK-PAGE %d of 
1b700 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
1b710 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1b720 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b730 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 50         TRACE3("P
1b740 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20  AGE %d is clean 
1b750 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  on %d\n", p->pgn
1b760 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1b770 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r));.      }.   
1b780 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
1b790 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  pHist);.      p-
1b7a0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1b7b0 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d    p->inJournal =
1b7c0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53   0;.      p->inS
1b7d0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1b7e0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d  ->pPrevStmt = p-
1b7f0 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
1b800 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1b810 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
1b820 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b830 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f  xReiniter(PGHDR_
1b840 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50 61 67  TO_DATA(p), pPag
1b850 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1b860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
1b870 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
1b880 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
1b890 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1b8a0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1b8b0 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72  ze;.    memoryTr
1b8c0 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
1b8d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1b8e0 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
1b8f0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1b900 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
1b910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b920 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
1b930 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1b940 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f  e || !pPager->jo
1b950 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
1b960 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
1b970 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1b980 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
1b990 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65  ize = -1;.    re
1b9a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1b9b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1b9c0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1b9d0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1b9e0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
1b9f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1ba00 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
1ba10 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
1ba20 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
1ba30 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
1ba40 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1ba50 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1ba60 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1ba70 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
1ba80 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20  int rc2;.    rc 
1ba90 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  = pager_reload_c
1baa0 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
1bab0 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e    rc2 = pager_un
1bac0 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
1bad0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1bae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1baf0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
1bb00 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
1bb10 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1bb20 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
1bb30 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1bb40 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   = -1;..  /* If 
1bb50 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1bb60 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
1bb70 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
1bb80 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
1bb90 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20  ger.  ** cache. 
1bba0 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72  So call pager_er
1bbb0 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79  ror() on the way
1bbc0 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79   out to make any
1bbd0 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72   error .  ** per
1bbe0 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  sistent..  */.  
1bbf0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
1bc00 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
1bc10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1bc20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61  TRUE if the data
1bc30 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
1bc40 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20  ned read-only.  
1bc50 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
1bc60 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1bc70 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77  is (in theory) w
1bc80 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  ritable..*/.int 
1bc90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 72  sqlite3pager_isr
1bca0 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
1bcb0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1bcc0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
1bcd0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  y;.}../*.** This
1bce0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1bcf0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
1bd00 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
1bd10 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70  */.int *sqlite3p
1bd20 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65 72  ager_stats(Pager
1bd30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
1bd40 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20  tic int a[11];. 
1bd50 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
1bd60 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
1bd70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
1bd80 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
1bd90 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
1bda0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1bdb0 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
1bdc0 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
1bdd0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1bde0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1bdf0 54 45 53 54 0a 20 20 61 5b 36 5d 20 3d 20 70 50  TEST.  a[6] = pP
1be00 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
1be10 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
1be20 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61  ss;.  a[8] = pPa
1be30 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b  ger->nOvfl;.  a[
1be40 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
1be50 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
1be60 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 23 65  ager->nWrite;.#e
1be70 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 61 3b  ndif.  return a;
1be80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1be90 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  e statement roll
1bea0 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a  back point..**.*
1beb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1bec0 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
1bed0 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61 63  with the transac
1bee0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72  tion journal alr
1bef0 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41  eady.** open.  A
1bf00 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a   new statement j
1bf10 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65  ournal is create
1bf20 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  d that can be us
1bf30 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ed to rollback.*
1bf40 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73  * changes of a s
1bf50 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e  ingle SQL comman
1bf60 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65  d within a large
1bf70 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  r transaction..*
1bf80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1bf90 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61  er_stmt_begin(Pa
1bfa0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1bfb0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a  int rc;.  char z
1bfc0 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50  Temp[SQLITE_TEMP
1bfd0 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73  NAME_SIZE];.  as
1bfe0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
1bff0 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73  tmtInUse );.  as
1c000 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1c010 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41  Size>=0 );.  TRA
1c020 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
1c030 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1c040 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1c050 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
1c060 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1c070 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
1c080 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
1c090 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65  ->dbSize;.    re
1c0a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c0b0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
1c0c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1c0d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
1c0e0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
1c0f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c100 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
1c110 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1c120 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61  nalOpen );.  pPa
1c130 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73  ger->aInStmt = s
1c140 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1c150 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1c160 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
1c170 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->aInStmt==0 ){
1c180 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
1c190 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1c1a0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
1c1b0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1c1c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
1c1d0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1c1e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1c1f0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1c200 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
1c210 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
1c220 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
1c230 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
1c240 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1c250 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67  tmtJSize == pPag
1c260 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1c270 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
1c280 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
1c290 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c2a0 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  f;.  pPager->stm
1c2b0 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
1c2c0 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  dbSize;.  pPager
1c2d0 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30  ->stmtHdrOff = 0
1c2e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
1c2f0 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  Cksum = pPager->
1c300 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28  cksumInit;.  if(
1c310 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70   !pPager->stmtOp
1c320 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
1c330 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
1c340 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61  temp(zTemp, &pPa
1c350 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
1c360 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
1c370 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
1c380 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1c390 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70  tOpen = 1;.    p
1c3a0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
1c3b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
1c3c0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
1c3d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c3e0 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67  E_OK;. .stmt_beg
1c3f0 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  in_failed:.  if(
1c400 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1c410 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1c420 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  ee(pPager->aInSt
1c430 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  mt);.    pPager-
1c440 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
1c450 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c460 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
1c470 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
1c480 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1c490 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65  stmt_commit(Page
1c4a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
1c4b0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1c4c0 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  Use ){.    PgHdr
1c4d0 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
1c4e0 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
1c4f0 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
1c500 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1c510 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
1c520 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
1c530 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74  sSeek(pPager->st
1c540 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a  fd, 0);.      /*
1c550 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
1c560 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
1c570 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
1c580 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
1c590 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
1c5a0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1c5b0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
1c5c0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
1c5d0 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
1c5e0 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
1c5f0 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
1c600 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73  xtStmt;.      as
1c610 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d  sert( pPg->inStm
1c620 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  t );.      pPg->
1c630 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
1c640 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
1c650 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1c660 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
1c670 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1c680 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1c690 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1c6a0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1c6b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
1c6c0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
1c6d0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1c6e0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1c6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1c700 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
1c710 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1c720 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
1c730 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1c740 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
1c750 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1c760 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
1c770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1c780 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
1c790 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1c7a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1c7b0 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  mt_rollback(Page
1c7c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1c7d0 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
1c7e0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1c7f0 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d  .    TRACE2("STM
1c800 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
1c810 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c820 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
1c830 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  B ){.      PgHdr
1c840 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
1c850 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
1c860 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
1c870 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
1c880 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1c890 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1c8a0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1c8b0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
1c8c0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
1c8d0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1c8e0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
1c8f0 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
1c900 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
1c910 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
1c920 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
1c930 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
1c940 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1c950 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
1c960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1c970 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1c980 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1c990 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
1c9a0 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
1c9b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c9c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1c9d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1c9e0 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
1c9f0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1ca00 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
1ca10 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
1ca20 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1ca30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ca40 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1ca50 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
1ca60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ca70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ca80 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
1ca90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1caa0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1cab0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1cac0 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
1cad0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1cae0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
1caf0 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
1cb00 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
1cb10 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
1cb20 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
1cb30 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1cb40 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28  e3pager_dirname(
1cb50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1cb60 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1cb70 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
1cb80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1cb90 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
1cba0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1cbb0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1cbc0 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1cbd0 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  journalname(Page
1cbe0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1cbf0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
1cc00 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
1cc10 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
1cc20 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
1cc30 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
1cc40 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
1cc50 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
1cc60 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
1cc70 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
1cc80 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1cc90 72 5f 6e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  r_nosync(Pager *
1cca0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1ccb0 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
1ccc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1ccd0 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
1cce0 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
1ccf0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
1cd00 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  _codec(.  Pager 
1cd10 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
1cd20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
1cd30 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
1cd40 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
1cd50 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
1cd60 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
1cd70 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
1cd80 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
1cd90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1cda0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1cdb0 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
1cdc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cdd0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
1cde0 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
1cdf0 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
1ce00 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
1ce10 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
1ce20 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1ce30 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ce40 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
1ce50 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
1ce60 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1ce70 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nter;.  int rc;.
1ce80 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20  .  /* Open page 
1ce90 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1cea0 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1ceb0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1cec0 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c  r_get(pPager, 1,
1ced0 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
1cee0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1cef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
1cf00 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1cf10 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69  rite(pPage);.  i
1cf20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1cf30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
1cf40 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72   /* Read the cur
1cf50 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79  rent value at by
1cf60 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48  te 24. */.  pPgH
1cf70 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  dr = DATA_TO_PGH
1cf80 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61  DR(pPage);.  cha
1cf90 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65  nge_counter = re
1cfa0 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
1cfb0 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20  Hdr, 24);..  /* 
1cfc0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1cfd0 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1cfe0 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1cff0 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1d000 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
1d010 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73  +;.  store32bits
1d020 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c  (change_counter,
1d030 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20   pPgHdr, 24);.. 
1d040 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1d050 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1d060 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  */.  sqlite3page
1d070 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1d080 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d090 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
1d0a0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1d0b0 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1d0c0 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1d0d0 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1d0e0 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1d0f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1d100 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1d110 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1d120 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1d130 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1d140 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1d150 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1d160 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1d170 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1d180 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1d190 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1d1a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1d1b0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1d1c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1d1d0 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1d1e0 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1d1f0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1d200 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1d210 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1d220 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1d230 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1d240 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1d250 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1d260 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1d270 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1d280 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1d290 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1d2a0 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1d2b0 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1d2c0 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1d2d0 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1d2e0 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1d2f0 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1d300 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1d310 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  nc() call..**.**
1d320 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1d330 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1d340 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1d350 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1d360 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1d370 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1d380 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1d390 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1d3a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1d3b0 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  er_sync(Pager *p
1d3c0 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
1d3d0 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f  r *zMaster, Pgno
1d3e0 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20   nTrunc){.  int 
1d3f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d400 0a 20 20 54 52 41 43 45 34 28 22 44 41 54 41 42  .  TRACE4("DATAB
1d410 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
1d420 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
1d430 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
1d440 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
1d450 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
1d460 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  runc);..  /* If 
1d470 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1d480 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
1d490 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
1d4a0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
1d4b0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1d4c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1d4d0 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
1d4e0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
1d4f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1d500 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
1d510 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
1d520 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1d530 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1d540 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
1d550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1d560 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  en );..    /* If
1d570 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1d580 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
1d590 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1d5a0 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
1d5b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
1d5c0 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
1d5d0 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
1d5e0 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
1d5f0 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
1d600 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
1d610 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
1d620 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
1d630 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
1d640 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1d650 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
1d660 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
1d670 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
1d680 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1d690 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
1d6a0 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
1d6b0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
1d6c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1d6d0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1d6e0 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
1d6f0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1d700 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
1d710 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1d720 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1d730 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
1d740 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d750 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1d760 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1d770 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
1d780 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1d790 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
1d7a0 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
1d7b0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
1d7c0 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
1d7d0 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
1d7e0 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
1d7f0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1d800 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1d810 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1d820 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1d830 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76  gno i;.        v
1d840 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
1d850 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20      int iSkip = 
1d860 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1d870 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ager);.        f
1d880 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
1d890 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
1d8a0 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
1d8b0 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50          if( !(pP
1d8c0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1d8d0 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37  [i/8] & (1<<(i&7
1d8e0 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20  ))) && i!=iSkip 
1d8f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1d900 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1d910 5f 67 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  _get(pPager, i, 
1d920 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
1d930 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d940 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1d950 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1d960 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1d970 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1d980 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1d990 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1d9a0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1d9b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d9c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1d9d0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1d9e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d9f0 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  } .      }.#endi
1da00 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  f.      rc = wri
1da10 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1da20 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1da30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1da40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1da50 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1da60 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
1da70 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1da80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1da90 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1daa0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  exit;.    }..#if
1dab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dac0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1dad0 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1dae0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1daf0 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
1db00 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1db10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1db20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1db30 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1db40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1db50 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
1db60 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
1db70 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1db80 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1db90 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1dba0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1dbb0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1dbc0 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
1dbd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1dbe0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1dbf0 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
1dc00 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1dc10 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1dc20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1dc30 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
1dc40 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1dc50 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
1dc60 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
1dc70 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1dc80 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79  _SYNCED;.  }..sy
1dc90 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72  nc_exit:.  retur
1dca0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1dcb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1dcc0 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f  OVACUUM./*.** Mo
1dcd0 76 65 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  ve the page iden
1dce0 74 69 66 69 65 64 20 62 79 20 70 44 61 74 61 20  tified by pData 
1dcf0 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f  to location pgno
1dd00 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a   in the file. .*
1dd10 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  *.** There must 
1dd20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73  be no references
1dd30 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
1dd40 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75  page pgno. If cu
1dd50 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67  rrent page.** pg
1dd60 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
1dd70 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
1dd80 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
1dd90 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65   not written the
1dda0 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73  re by.** by this
1ddb0 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61   routine. The sa
1ddc0 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68  me applies to th
1ddd0 65 20 70 61 67 65 20 70 44 61 74 61 20 72 65 66  e page pData ref
1dde0 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20  ers to on entry 
1ddf0 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
1de00 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
1de10 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
1de20 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 70   refered to by p
1de30 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69  Data remain vali
1de40 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
1de50 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
1de60 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67  ociated with pag
1de70 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61  e pData (i.e. da
1de80 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
1de90 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a   nExtra bytes.**
1dea0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
1deb0 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20   with the page) 
1dec0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
1ded0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
1dee0 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61  ler..**.** A tra
1def0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1df00 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69   active when thi
1df10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1df20 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20  led. It used to 
1df30 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74  be.** required t
1df40 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  hat a statement 
1df50 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1df60 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20  not active, but 
1df70 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
1df80 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d  .** has been rem
1df90 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44  oved (CREATE IND
1dfa0 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65  EX needs to move
1dfb0 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73   a page when a s
1dfc0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
1dfd0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
1dfe0 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e)..*/.int sqlit
1dff0 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65  e3pager_movepage
1e000 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1e010 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 50 67 6e  void *pData, Pgn
1e020 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1e030 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
1e040 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
1e050 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a  PgHdr *pPgOld; .
1e060 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20    int h;.  Pgno 
1e070 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
1e080 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
1e090 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54  ->nRef>0 );..  T
1e0a0 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
1e0b0 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
1e0c0 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
1e0d0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
1e0e0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1e0f0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
1e100 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20  dSync, pgno);.. 
1e110 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
1e120 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  nc ){.    needSy
1e130 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
1e140 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
1e150 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  pPg->inJournal )
1e160 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1e170 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  g->dirty );.    
1e180 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e190 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
1e1a0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  .  /* Unlink pPg
1e1b0 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d   from it's hash-
1e1c0 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e  chain */.  unlin
1e1d0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
1e1e0 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  r, pPg);..  /* I
1e1f0 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
1e200 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
1e210 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
1e220 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
1e230 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  * from it's hash
1e240 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
1e250 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
1e260 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
1e270 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
1e280 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
1e290 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
1e2a0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
1e2b0 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
1e2c0 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
1e2d0 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f  ere..  */.  pPgO
1e2e0 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
1e2f0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
1e300 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
1e310 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1e320 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
1e330 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
1e340 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
1e350 6c 64 29 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d  ld);.    pPgOld-
1e360 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1e370 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64  if( pPgOld->need
1e380 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
1e390 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e  sert( pPgOld->in
1e3a0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  Journal );.     
1e3b0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1e3c0 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 1;.      pPg->
1e3d0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1e3e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e3f0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
1e400 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1e410 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
1e420 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61  number for pPg a
1e430 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
1e440 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63  o the new hash-c
1e450 68 61 69 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e  hain. */.  pPg->
1e460 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68  pgno = pgno;.  h
1e470 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67   = pager_hash(pg
1e480 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
1e490 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  r->aHash[h] ){. 
1e4a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e4b0 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
1e4c0 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
1e4d0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1e4e0 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
1e4f0 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
1e500 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
1e510 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70  r->aHash[h];.  p
1e520 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
1e530 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50  = pPg;.  pPg->pP
1e540 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20  revHash = 0;..  
1e550 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
1e560 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1e570 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28  ache = 1;..  if(
1e580 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
1e590 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
1e5a0 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
1e5b0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
1e5c0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
1e5d0 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
1e5e0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
1e5f0 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
1e600 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
1e610 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
1e620 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
1e630 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
1e640 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
1e650 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
1e660 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50  nd the .    ** P
1e670 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ager.aInJournal 
1e680 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74  bit has been set
1e690 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
1e6a0 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c  be remedied by l
1e6b0 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  oading.    ** th
1e6c0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
1e6d0 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
1e6e0 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
1e6f0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e  r.needSync flag.
1e700 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1e710 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  he sqlite3pager_
1e720 67 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  get() call may c
1e730 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
1e740 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
1e750 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
1e760 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1e770 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
1e780 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1e790 20 72 63 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70   rc;.    void *p
1e7a0 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20 20 61 73  NeedSync;.    as
1e7b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1e7c0 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
1e7d0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1e7e0 67 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64  get(pPager, need
1e7f0 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64  SyncPgno, &pNeed
1e800 53 79 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 72  Sync);.    if( r
1e810 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1e820 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
1e830 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
1e840 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1e850 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1e860 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1e870 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44      DATA_TO_PGHD
1e880 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e  R(pNeedSync)->in
1e890 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1e8a0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1e8b0 4e 65 65 64 53 79 6e 63 29 2d 3e 64 69 72 74 79  NeedSync)->dirty
1e8c0 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
1e8d0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4e 65  3pager_unref(pNe
1e8e0 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20  edSync);.  }..  
1e8f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e900 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1e910 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1e920 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1e930 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
1e940 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1e950 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1e960 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f  the file lock fo
1e970 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
1e980 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  r..** The return
1e990 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66   value is one of
1e9a0 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44   NO_LOCK, SHARED
1e9b0 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
1e9c0 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47  LOCK,.** PENDING
1e9d0 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53  _LOCK, or EXCLUS
1e9e0 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74  IVE_LOCK..*/.int
1e9f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
1ea00 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
1ea10 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1ea20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74   sqlite3OsLockSt
1ea30 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ate(pPager->fd);
1ea40 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
1ea50 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1ea60 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
1ea70 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
1ea80 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
1ea90 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
1eaa0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1eab0 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50  3pager_refdump(P
1eac0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ead0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
1eae0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1eaf0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
1eb00 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
1eb10 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
1eb20 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1eb30 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1eb40 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
1eb50 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
1eb60 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
1eb70 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
1eb80 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
1eb90 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
1eba0 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
1ebb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
1ebc0 4f 20 2a 2f 0a                                   O */.