/ Hex Artifact Content
Login

Artifact ccca82d0f6644b95fd4f985d7049f1505443f048:


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 38  : pager.c,v 1.28
0350: 38 20 32 30 30 37 2f 30 33 2f 31 35 20 31 32 3a  8 2007/03/15 12:
0360: 35 31 3a 31 36 20 64 72 68 20 45 78 70 20 24 0a  51:16 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  tf.#define TRACE
0460: 31 28 58 29 20 20 20 20 20 20 20 73 71 6c 69 74  1(X)       sqlit
0470: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 29  e3DebugPrintf(X)
0480: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32 28  .#define TRACE2(
0490: 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74 65 33  X,Y)     sqlite3
04a0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29  DebugPrintf(X,Y)
04b0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28  .#define TRACE3(
04c0: 58 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33  X,Y,Z)   sqlite3
04d0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04e0: 5a 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  Z).#define TRACE
04f0: 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74  4(X,Y,Z,W) sqlit
0500: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
0510: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0520: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
0530: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
0540: 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23  ntf(X,Y,Z,W,V).#
0550: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
0560: 43 45 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54  CE1(X).#define T
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29  ne TRACE3(X,Y,Z)
0590: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
05a0: 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65  X,Y,Z,W).#define
05b0: 20 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c   TRACE5(X,Y,Z,W,
05c0: 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  V).#endif../*.**
05d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
05e0: 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73  wo macros are us
05f0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 54 52  ed within the TR
0600: 41 43 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62  ACEX() macros ab
0610: 6f 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20  ove.** to print 
0620: 6f 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70  out file-descrip
0630: 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47  tors. .**.** PAG
0640: 45 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70  ERID() takes a p
0650: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
0660: 72 20 73 74 72 75 63 74 20 61 73 20 69 74 27 73  r struct as it's
0670: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a   argument. The.*
0680: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  * associated fil
0690: 65 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e-descriptor is 
06a0: 72 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41  returned. FILEHA
06b0: 4e 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61  NDLEID() takes a
06c0: 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75  n OsFile.** stru
06d0: 63 74 20 61 73 20 69 74 27 73 20 61 72 67 75 6d  ct as it's argum
06e0: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
06f0: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
0700: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
0710: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0720: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
0730: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0740: 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69 73  he as a whole is
0750: 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f   always in one o
0760: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  f the following.
0770: 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  ** states:.**.**
0780: 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20     PAGER_UNLOCK 
0790: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20         The page 
07a0: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75 72  cache is not cur
07b0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
07c0: 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  r .**           
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
07e0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
07f0: 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69 73   file.  There is
0800: 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   no.**          
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0820: 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  a held in memory
0830: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 69  .  This is the i
0840: 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  nitial.**       
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  state..**.**   P
0870: 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20  AGER_SHARED     
0880: 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68     The page cach
0890: 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  e is reading the
08a0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20   database..**   
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20 6e      Writing is n
08d0: 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20 54  ot permitted.  T
08e0: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20  here can be.**  
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72 65       multiple re
0910: 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67 20  aders accessing 
0920: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
0930: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0940: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
0950: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
0960: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0970: 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54 68  RESERVED      Th
0980: 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20 72  is process has r
0990: 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74 61  eserved the data
09a0: 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e 67  base for writing
09b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
09c0: 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68 61            but ha
09d0: 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 61  s not yet made a
09e0: 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c  ny changes.  Onl
09f0: 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a  y one process.**
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a10: 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65         at a time
0a20: 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68 65   can reserve the
0a30: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
0a40: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20  original.**     
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20    database file 
0a70: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64  has not been mod
0a80: 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a  ified so other.*
0a90: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0aa0: 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 65          processe
0ab0: 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  s may still be r
0ac0: 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69  eading the on-di
0ad0: 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  sk.**           
0ae0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0af0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0b00: 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49     PAGER_EXCLUSI
0b10: 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65 20  VE     The page 
0b20: 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e 67  cache is writing
0b30: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
0b40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0b50: 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20 69          Access i
0b60: 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f  s exclusive.  No
0b70: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
0b80: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
0ba0: 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61 64  eads can be read
0bb0: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 77  ing or writing w
0bc0: 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  hile one.**     
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69    process is wri
0bf0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ting..**.**   PA
0c00: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
0c10: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
0c20: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
0c30: 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c 55  from PAGER_EXCLU
0c40: 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  SIVE.**         
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 66                af
0c60: 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ter all dirty pa
0c70: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
0c80: 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ca0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0cb0: 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
0cc0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
0cd0: 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   to.**          
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0cf0: 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d 61  k. All that rema
0d00: 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  ins to do is to 
0d10: 72 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20  remove the.**   
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
0d40: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
0d50: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  tion will be.** 
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e        committed.
0d80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0d90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0da0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0db0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0dc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65  a.** sqlite3page
0dd0: 72 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c 20  r_get() occurs, 
0de0: 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69  the state transi
0df0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53  tions to PAGER_S
0e00: 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20  HARED..** After 
0e10: 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62  all pages have b
0e20: 65 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69  een released usi
0e30: 6e 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75  ng sqlite_page_u
0e40: 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73  nref(),.** the s
0e50: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0e60: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55   back to PAGER_U
0e70: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0e80: 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73  t time.** that s
0e90: 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
0ea0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  e() is called, t
0eb0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0ec0: 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52  ions to.** PAGER
0ed0: 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74  _RESERVED.  (Not
0ee0: 65 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70 61  e that sqlite_pa
0ef0: 67 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20 6f  ge_write() can o
0f00: 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64  nly be.** called
0f10: 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   on an outstandi
0f20: 6e 67 20 70 61 67 65 20 77 68 69 63 68 20 6d 65  ng page which me
0f30: 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
0f40: 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e  er must.** be in
0f50: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 62 65   PAGER_SHARED be
0f60: 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74 69  fore it transiti
0f70: 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53  ons to PAGER_RES
0f80: 45 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74  ERVED.).** The t
0f90: 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47  ransition to PAG
0fa0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63  ER_EXCLUSIVE occ
0fb0: 75 72 73 20 77 68 65 6e 20 62 65 66 6f 72 65 20  urs when before 
0fc0: 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  any changes.** a
0fd0: 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
0fe0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 41  atabase file.  A
0ff0: 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33 70  fter an sqlite3p
1000: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a  ager_rollback().
1010: 2a 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70 61 67  ** or sqlite_pag
1020: 65 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65  er_commit(), the
1030: 20 73 74 61 74 65 20 67 6f 65 73 20 62 61 63 6b   state goes back
1040: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1050: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1060: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30  ER_UNLOCK      0
1070: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
1080: 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20 2f  HARED      1   /
1090: 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45 44  * same as SHARED
10a0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
10b0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
10c0: 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61     2   /* same a
10d0: 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  s RESERVED_LOCK 
10e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
10f0: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20 20  _EXCLUSIVE   4  
1100: 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c   /* same as EXCL
1110: 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  USIVE_LOCK */.#d
1120: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43  efine PAGER_SYNC
1130: 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a  ED      5../*.**
1140: 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 42   If the SQLITE_B
1150: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1160: 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20 74  K macro is set t
1170: 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69 6c  o true at compil
1180: 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20  e-time,.** then 
1190: 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73 20  failed attempts 
11a0: 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76 65  to get a reserve
11b0: 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f  d lock will invo
11c0: 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
11d0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73  back..** This is
11e0: 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74 2e   off by default.
11f0: 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63 6f    To see why, co
1200: 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1210: 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a  wing scenario:.*
1220: 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  * .** Suppose th
1230: 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20 68  read A already h
1240: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1250: 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65 73   and wants a res
1260: 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54  erved lock..** T
1270: 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79 20  hread B already 
1280: 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  has a reserved l
1290: 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 6e  ock and wants an
12a0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
12b0: 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72    If.** both thr
12c0: 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20 74  eads are using t
12d0: 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62 61  heir busy callba
12e0: 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62 65  cks, it might be
12f0: 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20   a long time.** 
1300: 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  be for one of th
1310: 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20 75  e threads give u
1320: 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65  p and allows the
1330: 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65 65   other to procee
1340: 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  d..** But if the
1350: 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20 74   thread trying t
1360: 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72 76  o get the reserv
1370: 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75 70  ed lock gives up
1380: 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20   quickly.** (if 
1390: 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73  it never invokes
13a0: 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62 61   its busy callba
13b0: 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ck) then the con
13c0: 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  tention will be.
13d0: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69 63  ** resolved quic
13e0: 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  kly..*/.#ifndef 
13f0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1400: 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  RVED_LOCK.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  ne SQLITE_BUSY_R
1420: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23  ESERVED_LOCK 0.#
1430: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1440: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1450: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1460: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1470: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
1480: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
1490: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
14a0: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
14b0: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
14c0: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
14d0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
14e0: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
14f0: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  &~7)../*.** Each
1500: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65   in-memory image
1510: 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69 6e   of a page begin
1520: 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  s with the follo
1530: 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20  wing header..** 
1540: 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20 6f  This header is o
1550: 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20 74  nly visible to t
1560: 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c 65  his pager module
1570: 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a  .  The client.**
1580: 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c 73   code that calls
1590: 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c 79   pager sees only
15a0: 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20 66   the data that f
15b0: 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64 65  ollows the heade
15c0: 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20  r..**.** Client 
15d0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c  code should call
15e0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
15f0: 69 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65 20  ite() on a page 
1600: 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a  prior to making.
1610: 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74  ** any modificat
1620: 69 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61 67  ions to that pag
1630: 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69  e.  The first ti
1640: 6d 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  me sqlite3pager_
1650: 77 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63 61  write().** is ca
1660: 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  lled, the origin
1670: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
1680: 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
1690: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
16a0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67  * journal and Pg
16b0: 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e  Hdr.inJournal an
16c0: 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  d PgHdr.needSync
16d0: 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65 72   are set.  Later
16e0: 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f  , once.** the jo
16f0: 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20 6d  urnal page has m
1700: 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65 20  ade it onto the 
1710: 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50 67  disk surface, Pg
1720: 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20  Hdr.needSync.** 
1730: 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68 65  is cleared.  The
1740: 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 63   modified page c
1750: 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  annot be written
1760: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f   back into the o
1770: 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62  riginal.** datab
1780: 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  ase file until t
1790: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73  he journal pages
17a0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
17b0: 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68 65   to disk and the
17c0: 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53 79  .** PgHdr.needSy
17d0: 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  nc has been clea
17e0: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  red..**.** The P
17f0: 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67 20  gHdr.dirty flag 
1800: 69 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c 69  is set when sqli
1810: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
1820: 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a   is called and.*
1830: 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61 67 61  * is cleared aga
1840: 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  in when the page
1850: 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69 74   content is writ
1860: 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
1870: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
1880: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79  base file..*/.ty
1890: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
18a0: 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63 74  dr PgHdr;.struct
18b0: 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65 72   PgHdr {.  Pager
18c0: 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
18d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18e0: 20 70 61 67 65 72 20 74 6f 20 77 68 69 63 68 20   pager to which 
18f0: 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e 67  this page belong
1900: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
1910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1920: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
1930: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  e number for thi
1940: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
1950: 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a 70  r *pNextHash, *p
1960: 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48 61  PrevHash;  /* Ha
1970: 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
1980: 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67 6e  in for PgHdr.pgn
1990: 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  o */.  PgHdr *pN
19a0: 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76 46  extFree, *pPrevF
19b0: 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73  ree;  /* Freelis
19c0: 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72 65  t of pages where
19d0: 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67   nRef==0 */.  Pg
19e0: 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20  Hdr *pNextAll;  
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a00: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  A list of all pa
1a10: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
1a20: 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65  pNextStmt, *pPre
1a30: 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20  vStmt;  /* List 
1a40: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1a50: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1a60: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72  l */.  u8 inJour
1a70: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
1a80: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1a90: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
1aa0: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
1ab0: 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20 20    u8 inStmt;    
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20 74   /* TRUE if in t
1ae0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
1af0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
1b00: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b20: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
1b30: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
1b40: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
1b50: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
1b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
1b70: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
1b80: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
1b90: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
1ba0: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
1bb0: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
1bc0: 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
1bd0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
1be0: 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e 52  /.  short int nR
1bf0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
1c00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c10: 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70 61  users of this pa
1c20: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
1c30: 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44 69 72  Dirty, *pPrevDir
1c40: 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74 79 20  ty;    /* Dirty 
1c50: 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  pages */.  u32 n
1c60: 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20 20  otUsed;         
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
1c80: 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23 69 66  fer space */.#if
1c90: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1ca0: 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61 67  _PAGES.  u32 pag
1cb0: 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20  eHash;.#endif.  
1cc0: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /* pPager->pageS
1cd0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61 67  ize bytes of pag
1ce0: 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  e data follow th
1cf0: 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f  is header */.  /
1d00: 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  * Pager.nExtra b
1d10: 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61  ytes of local da
1d20: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61  ta follow the pa
1d30: 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f  ge data */.};../
1d40: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
1d50: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
1d60: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
1d70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
1d80: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
1d90: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
1da0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
1db0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1dc0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
1dd0: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
1de0: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
1df0: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
1e00: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
1e10: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
1e20: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
1e30: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
1e40: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1e50: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
1e60: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1e70: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
1e80: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
1e90: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
1ea0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
1eb0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
1ec0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
1ed0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
1ee0: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
1ef0: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
1f00: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
1f10: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
1f20: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
1f30: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
1f40: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
1f50: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
1f60: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
1f70: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
1f80: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
1f90: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
1fa0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
1fb0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
1fc0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
1fd0: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
1fe0: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
1ff0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
2000: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
2010: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
2020: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
2030: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
2040: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a  tatement */.};..
2050: 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73  /*.** A macro us
2060: 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20  ed for invoking 
2070: 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65  the codec if the
2080: 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66  re is one.*/.#if
2090: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
20a0: 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f  ODEC.# define CO
20b0: 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66  DEC1(P,D,N,X) if
20c0: 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29  ( P->xCodec!=0 )
20d0: 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  { P->xCodec(P->p
20e0: 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b  CodecArg,D,N,X);
20f0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45   }.# define CODE
2100: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
2110: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d  ar*)(P->xCodec!=
2120: 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  0?P->xCodec(P->p
2130: 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a  CodecArg,D,N,X):
2140: 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  D)).#else.# defi
2150: 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c  ne CODEC1(P,D,N,
2160: 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23  X) /* NO-OP */.#
2170: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
2180: 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29  ,D,N,X) ((char*)
2190: 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  D).#endif../*.**
21a0: 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74   Convert a point
21b0: 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e  er to a PgHdr in
21c0: 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
21d0: 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20  its data.** and 
21e0: 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23  back again..*/.#
21f0: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
2200: 44 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a  DATA(P)  ((void*
2210: 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66  )(&(P)[1])).#def
2220: 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  ine DATA_TO_PGHD
2230: 52 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a  R(D)  (&((PgHdr*
2240: 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69  )(D))[-1]).#defi
2250: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  ne PGHDR_TO_EXTR
2260: 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26  A(G,P) ((void*)&
2270: 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d  ((char*)(&(G)[1]
2280: 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a 65  ))[(P)->pageSize
2290: 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  ]).#define PGHDR
22a0: 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29 20  _TO_HIST(P,PGR) 
22b0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 28   \.            (
22c0: 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28 63  (PgHistory*)&((c
22d0: 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b  har*)(&(P)[1]))[
22e0: 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65 2b  (PGR)->pageSize+
22f0: 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a  (PGR)->nExtra]).
2300: 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61  ./*.** A open pa
2310: 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69  ge cache is an i
2320: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
2330: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2340: 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e  re..**.** Pager.
2350: 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73  errCode may be s
2360: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45  et to SQLITE_IOE
2370: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
2380: 50 54 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  PT, SQLITE_PROTO
2390: 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  COL.** or SQLITE
23a0: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
23b0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
23c0: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
23d0: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
23e0: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
23f0: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
2400: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
2410: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
2420: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
2430: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
2440: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
2450: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
2460: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
2470: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
2480: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
2490: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
24a0: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
24b0: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
24c0: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
24d0: 74 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67  t the sqlite3pag
24e0: 65 72 5f 67 65 74 28 29 20 61 6e 64 20 73 71 6c  er_get() and sql
24f0: 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
2500: 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79  ().** APIs, they
2510: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
2520: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2530: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
2540: 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f   {.  u8 journalO
2550: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2560: 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72   /* True if jour
2570: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
2580: 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f  tors is valid */
2590: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61  .  u8 journalSta
25a0: 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  rted;          /
25b0: 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72  * True if header
25c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73   of journal is s
25d0: 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73  ynced */.  u8 us
25e0: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
25f0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
2600: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2610: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
2620: 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b  .  u8 noReadlock
2630: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2640: 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
2650: 74 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f  to obtain readlo
2660: 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  cks */.  u8 stmt
2670: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2680: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2690: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
26a0: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
26b0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
26c0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
26d0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
26e0: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
26f0: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2700: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2710: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2720: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2730: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
2740: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
2750: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2790: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
27a0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
27b0: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
27c0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
27d0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
27e0: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c  ness */.  u8 ful
27f0: 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20 20 20 20  l_fsync;        
2800: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 46 5f 46        /* Use F_F
2810: 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e 20 61 76  ULLFSYNC when av
2820: 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20  ailable */.  u8 
2830: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
2840: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
2850: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
2860: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
2870: 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  c. */.  u8 tempF
2880: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2890: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
28a0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
28b0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
28c0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
28d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
28e0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
28f0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2900: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2910: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2920: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2930: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2940: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2950: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2960: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2970: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2980: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2990: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
29a0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
29b0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
29c0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
29d0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
29e0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
29f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a00: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2a10: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2a20: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
2a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a40: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2a50: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2a60: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74  to jrnl */.  int
2a70: 20 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20   errCode;       
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2a90: 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73  of several kinds
2aa0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
2ab0: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ad0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2ae0: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
2af0: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
2b10: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
2b20: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
2b30: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a  */.  int stmtSiz
2b40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
2b60: 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20  base (in pages) 
2b70: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
2b80: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2bb0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ges written to t
2bc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2bd0: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
2bf0: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
2c00: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
2c10: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
2c20: 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20  nt stmtNRec;    
2c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c40: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
2c50: 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e  in stmt subjourn
2c60: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  al */.  int nExt
2c70: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
2c80: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
2c90: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
2ca0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2cb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  e */.  int pageS
2cc0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2cd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ce0: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2d20: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
2d30: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ges */.  int nMa
2d40: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2d50: 20 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74       /* High wat
2d60: 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65  er mark of nPage
2d70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2da0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2db0: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2dc0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2de0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2df0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
2e00: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
2e10: 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61  .  u8 *aInJourna
2e20: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
2e30: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
2e40: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
2e50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2e60: 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20    u8 *aInStmt;  
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e80: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2e90: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2ea0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
2eb0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
2ec0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2ed0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2ee0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2ef0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
2f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2f10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f20: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
2f30: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
2f40: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
2f50: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
2f60: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2f70: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c  */.  OsFile *fd,
2f80: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
2f90: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2fa0: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
2fb0: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
2fc0: 0a 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b  .  OsFile *stfd;
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fe0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2ff0: 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  r for the statem
3000: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f  ent subjournal*/
3010: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
3020: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
3030: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
3040: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
3050: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
3060: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
3070: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
3080: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3090: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
30a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
30b0: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
30c0: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
30d0: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
30e0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
30f0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
3100: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
3110: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
3120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
3130: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
3140: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3150: 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72  urnal */.  PgHdr
3160: 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20   *pDirty;       
3170: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
3180: 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
3190: 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  s */.  i64 journ
31a0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
31b0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
31c0: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
31d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
31e0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
31f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3200: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
3210: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
3220: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
3230: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
3240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
3250: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
3260: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
3270: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
3280: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
3290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
32a0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
32b0: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
32c0: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
32d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
32e0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
32f0: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
3300: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
3310: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3320: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3330: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3340: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3360: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
3370: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
3380: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
3390: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
33a0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
33b0: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
33c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
33d0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
33e0: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
33f0: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
3400: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
3410: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
3420: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3430: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
3440: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
3450: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
3460: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
3470: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
3480: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
3490: 2f 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  /.  void *(*xCod
34a0: 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
34b0: 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f  Pgno,int); /* Ro
34c0: 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63  utine for en/dec
34d0: 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  oding data */.  
34e0: 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b  void *pCodecArg;
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3500: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
3510: 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 69   xCodec() */.  i
3520: 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20  nt nHash;       
3530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3540: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
3550: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
3560: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20  PgHdr **aHash;  
3570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3580: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
3590: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
35a0: 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20  PgHdr */.#ifdef 
35b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
35c0: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
35d0: 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20    Pager *pNext; 
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35f0: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
3600: 70 61 67 65 72 73 20 69 6e 20 74 68 69 73 20 74  pagers in this t
3610: 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a  hread */.#endif.
3620: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
3630: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3640: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
3650: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
3660: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 7d 3b  or tmp use */.};
3670: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
3680: 45 5f 54 45 53 54 20 69 73 20 64 65 66 69 6e 65  E_TEST is define
3690: 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  d then increment
36a0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 67 69   the variable gi
36b0: 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72  ven in.** the ar
36c0: 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66  gument.*/.#ifdef
36d0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 20 64   SQLITE_TEST.# d
36e0: 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28  efine TEST_INCR(
36f0: 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20  x)  x++.#else.# 
3700: 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43 52  define TEST_INCR
3710: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
3720: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
3730: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
3740: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
3750: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
3760: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
3770: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
3780: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
3790: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
37a0: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
37b0: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
37c0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
37d0: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
37e0: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
37f0: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
3800: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
3810: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
3820: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
3830: 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74  s begin.** writt
3840: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
3850: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
3860: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
3870: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
3880: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
3890: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
38a0: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
38b0: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
38c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
38d0: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
38e0: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
38f0: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
3900: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
3910: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
3920: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
3930: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
3940: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
3950: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
3960: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
3970: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
3980: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
3990: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
39a0: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
39b0: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
39c0: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
39d0: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
39e0: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
39f0: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
3a00: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
3a10: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
3a20: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
3a30: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
3a40: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
3a50: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
3a60: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
3a70: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
3a80: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3a90: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
3aa0: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
3ab0: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
3ac0: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
3ad0: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
3ae0: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
3af0: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
3b00: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
3b10: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
3b20: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
3b30: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
3b40: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
3b50: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
3b60: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
3b70: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
3b80: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
3b90: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
3ba0: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
3bb0: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
3bc0: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
3bd0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
3be0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
3bf0: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
3c00: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
3c10: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
3c20: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
3c30: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
3c40: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
3c50: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
3c60: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
3c70: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
3c80: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
3c90: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
3ca0: 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
3cb0: 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70  er and of each p
3cc0: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
3cd0: 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  al is determined
3ce0: 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f  .** by the follo
3cf0: 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  wing macros..*/.
3d00: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3d10: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
3d20: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
3d30: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
3d40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
3d50: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
3d60: 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75  pager. In the fu
3d70: 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64  ture, this could
3d80: 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f   be.** set to so
3d90: 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  me value read fr
3da0: 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74  om the disk cont
3db0: 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f  roller. The impo
3dc0: 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74  rtant.** charact
3dd0: 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20  eristic is that 
3de0: 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73  it is the same s
3df0: 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65  ize as a disk se
3e00: 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ctor..*/.#define
3e10: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
3e20: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
3e30: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
3e40: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
3e50: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
3e60: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
3e70: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
3e80: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
3e90: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
3ea0: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
3eb0: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
3ec0: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
3ed0: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
3ee0: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
3ef0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
3f00: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
3f10: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
3f20: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
3f30: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
3f40: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
3f50: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
3f60: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
3f70: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
3f80: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
3f90: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
3fa0: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
3fb0: 73 69 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73  size of a disk s
3fc0: 65 63 74 6f 72 0a 2a 2f 0a 23 69 66 6e 64 65 66  ector.*/.#ifndef
3fd0: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
3fe0: 5a 45 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  ZE.# define PAGE
3ff0: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35 31  R_SECTOR_SIZE 51
4000: 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  2.#endif../*.** 
4010: 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45  Page number PAGE
4020: 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76  R_MJ_PGNO is nev
4030: 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51  er used in an SQ
4040: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69  Lite database (i
4050: 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64  t is.** reserved
4060: 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f   for working aro
4070: 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f  und a windows/po
4080: 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c  six incompatibil
4090: 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75  ity). It is.** u
40a0: 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  sed in the journ
40b0: 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  al to signify th
40c0: 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  at the remainder
40d0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
40e0: 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f  file .** is devo
40f0: 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61  ted to storing a
4100: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4110: 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65  name - there are
4120: 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74   no more pages t
4130: 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  o.** roll back. 
4140: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72  See comments for
4150: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d   function writeM
4160: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
4170: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f  or details..*/./
4180: 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  * #define PAGER_
4190: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44  MJ_PGNO(x) (PEND
41a0: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
41b0: 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65  ageSize)) */.#de
41c0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
41d0: 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f  NO(x) ((PENDING_
41e0: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
41f0: 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  ize))+1)../*.** 
4200: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  The maximum lega
4210: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  l page number is
4220: 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a   (2^31 - 1)..*/.
4230: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41  #define PAGER_MA
4240: 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34  X_PGNO 214748364
4250: 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  7../*.** Enable 
4260: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
4270: 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65  tracking (for de
4280: 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a  bugging) here:.*
4290: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
42a0: 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65 72  TEST.  int pager
42b0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
42c0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
42d0: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
42e0: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
42f0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
4300: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
4310: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
4320: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
4330: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
4340: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45  intf(.       "RE
4350: 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25  FCNT: %4d addr=%
4360: 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74 61  p nRef=%-3d tota
4370: 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  l=%d\n",.       
4380: 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  p->pgno, PGHDR_T
4390: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
43a0: 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e 6e  ef, p->pPager->n
43b0: 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  Ref.    );.    c
43c0: 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74  nt++;   /* Somet
43d0: 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72  hing to set a br
43e0: 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20  eakpoint on */. 
43f0: 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49   }.# define REFI
4400: 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65  NFO(X)  pager_re
4410: 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23  finfo(X).#else.#
4420: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
4430: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
4440: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
4450: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
4460: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20  ash table to N. 
4470: 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77   N must be a pow
4480: 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f  er.** of two..*/
4490: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
44a0: 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
44b0: 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  able(Pager *pPag
44c0: 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67  er, int N){.  Pg
44d0: 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50  Hdr **aHash, *pP
44e0: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  g;.  assert( N>0
44f0: 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30   && (N&(N-1))==0
4500: 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71   );.  aHash = sq
4510: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
4520: 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29  of(aHash[0])*N )
4530: 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30  ;.  if( aHash==0
4540: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75   ){.    /* Failu
4550: 72 65 20 74 6f 20 72 65 68 61 73 68 20 69 73 20  re to rehash is 
4560: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49  not an error.  I
4570: 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66  t is only a perf
4580: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a  ormance hit. */.
4590: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
45a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
45b0: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
45c0: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e  Pager->nHash = N
45d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
45e0: 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72  h = aHash;.  for
45f0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
4600: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
4610: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
4620: 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70  int h;.    if( p
4630: 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
4640: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
4650: 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26  ->pNextHash==0 &
4660: 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  & pPg->pPrevHash
4670: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ==0 );.      con
4680: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
4690: 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26   h = pPg->pgno &
46a0: 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d   (N-1);.    pPg-
46b0: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61  >pNextHash = aHa
46c0: 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61  sh[h];.    if( a
46d0: 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20  Hash[h] ){.     
46e0: 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76   aHash[h]->pPrev
46f0: 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
4700: 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d  }.    aHash[h] =
4710: 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70   pPg;.    pPg->p
4720: 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20  PrevHash = 0;.  
4730: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
4740: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4750: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4760: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4770: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4780: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4790: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
47a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
47b0: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
47c0: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
47d0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
47e0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
47f0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4800: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4810: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4820: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
4830: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 4f  int read32bits(O
4840: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a  sFile *fd, u32 *
4850: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
4860: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
4870: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
4880: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
4890: 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20 69 66  izeof(ac));.  if
48a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
48b0: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 28  ){.    *pRes = (
48c0: 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63  ac[0]<<24) | (ac
48d0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32  [1]<<16) | (ac[2
48e0: 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20  ]<<8) | ac[3];. 
48f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4900: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
4910: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4920: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
4930: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
4940: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
4950: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
4960: 74 33 32 62 69 74 73 28 63 68 61 72 20 2a 61 63  t32bits(char *ac
4970: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 61 63  , u32 val){.  ac
4980: 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20  [0] = (val>>24) 
4990: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20  & 0xff;.  ac[1] 
49a0: 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78  = (val>>16) & 0x
49b0: 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76  ff;.  ac[2] = (v
49c0: 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20  al>>8) & 0xff;. 
49d0: 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30   ac[3] = val & 0
49e0: 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  xff;.}../*.** Wr
49f0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
4a00: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
4a10: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
4a20: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tor.  Return SQL
4a30: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
4a40: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
4a50: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
4a60: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
4a70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
4a80: 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20  te32bits(OsFile 
4a90: 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  *fd, u32 val){. 
4aa0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70   char ac[4];.  p
4ab0: 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c  ut32bits(ac, val
4ac0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
4ad0: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
4ae0: 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c, 4);.}../*.** 
4af0: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
4b00: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
4b10: 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68  'offset' from th
4b20: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
4b30: 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61  d by.** page hea
4b40: 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74  der 'p'..*/.stat
4b50: 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65 33  ic u32 retrieve3
4b60: 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20  2bits(PgHdr *p, 
4b70: 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75  int offset){.  u
4b80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63  nsigned char *ac
4b90: 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69  ;.  ac = &((unsi
4ba0: 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52  gned char*)PGHDR
4bb0: 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66  _TO_DATA(p))[off
4bc0: 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28  set];.  return (
4bd0: 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63  ac[0]<<24) | (ac
4be0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32  [1]<<16) | (ac[2
4bf0: 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d  ]<<8) | ac[3];.}
4c00: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
4c10: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
4c20: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
4c30: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
4c40: 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  hin the pager.**
4c50: 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74   code. The first
4c60: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
4c70: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
4c80: 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
4c90: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65  he.** second the
4ca0: 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75   error-code abou
4cb0: 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
4cc0: 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20   by a pager API 
4cd0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68  function. .** Th
4ce0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
4cf0: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
4d00: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
4d10: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
4d20: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
4d30: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
4d40: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
4d50: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
4d60: 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52 4f 54  T or SQLITE_PROT
4d70: 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65 72 72  OCOL,.** the err
4d80: 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69  or becomes persi
4d90: 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65  stent. All subse
4da0: 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20  quent API calls 
4db0: 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a 2a  on this Pager.**
4dc0: 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
4dd0: 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  y return the sam
4de0: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
4df0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
4e00: 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
4e10: 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
4e20: 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
4e30: 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
4e40: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
4e50: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
4e60: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
4e70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
4e80: 20 69 66 28 20 0a 20 20 20 20 72 63 32 3d 3d 53   if( .    rc2==S
4e90: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
4ea0: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f    rc2==SQLITE_IO
4eb0: 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ERR ||.    rc2==
4ec0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
4ed0: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
4ee0: 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29 7b 0a  E_PROTOCOL.  ){.
4ef0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
4f00: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
4f10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
4f20: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
4f30: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
4f40: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
4f50: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
4f60: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
4f70: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
4f80: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
4f90: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32  r *pPage){.  u32
4fa0: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
4fb0: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
4fc0: 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e  har *pData = (un
4fd0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47  signed char *)PG
4fe0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67  HDR_TO_DATA(pPag
4ff0: 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
5000: 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e  <pPage->pPager->
5010: 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a  pageSize; i++){.
5020: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
5030: 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20  +i)^pData[i];.  
5040: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
5050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
5060: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
5070: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
5080: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
5090: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
50a0: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
50b0: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
50c0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
50d0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
50e0: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
50f0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
5100: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
5110: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
5120: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
5130: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
5140: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
5150: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
5160: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
5170: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
5180: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
5190: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
51a0: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
51b0: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
51c0: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45  r->errCode || ME
51d0: 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74  MDB || pPg->dirt
51e0: 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d  y || .      pPg-
51f0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
5200: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
5210: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
5220: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
5230: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
5240: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
5250: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
5260: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
5270: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
5280: 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  n..** The master
5290: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
52a0: 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  me is read from 
52b0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
52c0: 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74  ile and .** writ
52d0: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
52e0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
52f0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70  liteMalloc(). *p
5300: 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65  zMaster is.** se
5310: 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  t to point at th
5320: 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  e memory and SQL
5330: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
5340: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5350: 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29  .** sqliteFree()
5360: 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a   *pzMaster..**.*
5370: 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  * If no master j
5380: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5390: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d   is present *pzM
53a0: 61 73 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  aster is set to 
53b0: 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  0 and.** SQLITE_
53c0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
53d0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
53e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46  asterJournal(OsF
53f0: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
5400: 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20   **pzMaster){.  
5410: 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65  int rc;.  u32 le
5420: 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20  n;.  i64 szJ;.  
5430: 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74  u32 cksum;.  int
5440: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
5450: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
5460: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
5470: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
5480: 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73  der */..  *pzMas
5490: 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  ter = 0;..  rc =
54a0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
54b0: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
54c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
54d0: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
54e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
54f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
5500: 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29  k(pJrnl, szJ-16)
5510: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5520: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5530: 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64  c;. .  rc = read
5540: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c  32bits(pJrnl, &l
5550: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5560: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5570: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
5580: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
5590: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
55a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
55b0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
55c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
55d0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
55e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
55f0: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
5600: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
5610: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
5620: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5630: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
5640: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  rnl, szJ-16-len)
5650: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5660: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5670: 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  c;..  *pzMaster 
5680: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
5690: 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20  Malloc(len+1);. 
56a0: 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20   if( !*pzMaster 
56b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
56c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
56d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
56e0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d  Read(pJrnl, *pzM
56f0: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
5700: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5710: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
5720: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
5730: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
5740: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
5750: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
5760: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
5770: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
5780: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
5790: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
57a0: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
57b0: 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65  sum -= (*pzMaste
57c0: 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  r)[i];.  }.  if(
57d0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
57e0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
57f0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
5800: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
5810: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
5820: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
5830: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
5840: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
5850: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5860: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
5870: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
5880: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
5890: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
58a0: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
58b0: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
58c0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
58d0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
58e0: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
58f0: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
5900: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c  aster = 0;.  }el
5910: 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74  se{.    (*pzMast
5920: 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  er)[len] = '\0';
5930: 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72  .  }.   .  retur
5940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5950: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a  /*.** Seek the j
5960: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
5970: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  riptor to the ne
5980: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
5990: 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f  ry where a.** jo
59a0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79  urnal header may
59b0: 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
59c0: 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ten. Pager.journ
59d0: 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64  alOff is updated
59e0: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77   with.** the new
59f0: 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a   seek offset..**
5a00: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
5a10: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
5a20: 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66  :.**.** Input Of
5a30: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
5a40: 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a    Output Offset.
5a50: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
5a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20  ----------.** 0 
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a90: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32          0.** 512
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ab0: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30         512.** 10
5ac0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5ad0: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32          512.** 2
5ae0: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
5af0: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
5b00: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
5b10: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
5b20: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5b30: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
5b40: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
5b50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5b60: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
5b70: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
5b80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5b90: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
5ba0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5bb0: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
5bc0: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
5bd0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
5be0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5bf0: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
5c00: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
5c10: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
5c20: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
5c30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5c40: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74   = offset;.  ret
5c50: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65  urn sqlite3OsSee
5c60: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
5c70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5c80: 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  f);.}../*.** The
5c90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
5ca0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
5cb0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5cc0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
5cd0: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
5ce0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
5cf0: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
5d00: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
5d10: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
5d20: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
5d30: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
5d40: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
5d50: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
5d60: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
5d70: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
5d80: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
5d90: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
5da0: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
5db0: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
5dc0: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
5dd0: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
5de0: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
5df0: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
5e00: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
5e10: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
5e20: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
5e30: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
5e40: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
5e50: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
5e60: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
5e70: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
5e80: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
5e90: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
5ea0: 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66  Z - 24) bytes of
5eb0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
5ec0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
5ed0: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
5ee0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63  er *pPager){.  c
5ef0: 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65  har zHeader[size
5f00: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
5f10: 29 2b 31 36 5d 3b 0a 0a 20 20 69 6e 74 20 72 63  )+16];..  int rc
5f20: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5f30: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5f40: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5f50: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
5f60: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
5f70: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5f80: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
5f90: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
5fa0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
5fb0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
5fc0: 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70  rnalHdr;.  }.  p
5fd0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5fe0: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
5ff0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
6000: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
6010: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
6020: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
6030: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
6040: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
6050: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
6060: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
6070: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
6080: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
6090: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
60a0: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
60b0: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
60c0: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
60d0: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
60e0: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
60f0: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
6100: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
6110: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ..  */.  memcpy(
6120: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
6130: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
6140: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
6150: 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69    /* The nRec Fi
6160: 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20  eld. 0xFFFFFFFF 
6170: 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72  for no-sync jour
6180: 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32  nals. */.  put32
6190: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
61a0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
61b0: 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f  ic)], pPager->no
61c0: 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66  Sync ? 0xfffffff
61d0: 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65  f : 0);.  /* The
61e0: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
61f0: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
6200: 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64  / .  sqlite3Rand
6210: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
6220: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6230: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
6240: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
6250: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6260: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6270: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
6280: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
6290: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
62a0: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
62b0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
62c0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
62d0: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
62e0: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a  r->dbSize);.  /*
62f0: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
6300: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
6310: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
6320: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6330: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6340: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
6350: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
6360: 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48  ;.  IOTRACE(("JH
6370: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
6380: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
6390: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69  ->journalHdr, si
63a0: 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 29 0a  zeof(zHeader))).
63b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
63c0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
63d0: 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
63e0: 6f 66 28 7a 48 65 61 64 65 72 29 29 3b 0a 0a 20  of(zHeader));.. 
63f0: 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
6400: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
6410: 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66  written successf
6420: 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a  ully. Seek the j
6430: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
6440: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
6450: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
6460: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
6470: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tor..  */.  if( 
6480: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6490: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
64a0: 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  TAIL %p %lld\n",
64b0: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
64c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a  >journalOff-1)).
64d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
64e0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
64f0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
6500: 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69  nalOff-1);.    i
6510: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6520: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
6530: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
6540: 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30  ager->jfd, "\000
6550: 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", 1);.    }.  }
6560: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6570: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
6580: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
6590: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
65a0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
65b0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
65c0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
65d0: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
65e0: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
65f0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
6600: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
6610: 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  le. See comments
6620: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
6630: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
6640: 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  ) for a descript
6650: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f  ion of.** the jo
6660: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
6670: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
6680: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
6690: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
66a0: 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  nRec is set to t
66b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
66c0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
66d0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
66e0: 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69  er and *dbSize i
66f0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
6700: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
6710: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
6720: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
6730: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
6740: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
6750: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
6760: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
6770: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
6780: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
6790: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
67a0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
67b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
67c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
67d0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
67e0: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
67f0: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
6800: 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20  urned and *nRec 
6810: 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20  and *dbSize are 
6820: 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55  not set.  If JOU
6830: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
6840: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
6850: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
6860: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
6870: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
6880: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
6890: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
68a0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
68b0: 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e  er, .  i64 journ
68c0: 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70  alSize,.  u32 *p
68d0: 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44  NRec, .  u32 *pD
68e0: 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72  bSize.){.  int r
68f0: 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
6900: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
6910: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
6920: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
6930: 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65  er */..  rc = se
6940: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
6950: 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ger);.  if( rc )
6960: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
6970: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
6980: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
6990: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
69a0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
69b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
69c0: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
69d0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
69e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
69f0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
6a00: 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ic));.  if( rc )
6a10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
6a20: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
6a30: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6a40: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
6a50: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6a60: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
6a70: 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33   }..  rc = read3
6a80: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
6a90: 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  d, pNRec);.  if(
6aa0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6ab0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6ac0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
6ad0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
6ae0: 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nit);.  if( rc )
6af0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
6b00: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6b10: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53  Pager->jfd, pDbS
6b20: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
6b30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
6b40: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
6b50: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
6b60: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
6b70: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a  lue used by .  *
6b80: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
6b90: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
6ba0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
6bb0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a   journal was.  *
6bc0: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
6bd0: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
6be0: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
6bf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
6c00: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
6c10: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
6c20: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
6c30: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
6c40: 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73  .  ** of Pager.s
6c50: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
6c60: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
6c70: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
6c80: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
6c90: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
6ca0: 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50  >jfd, (u32 *)&pP
6cb0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
6cc0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6cd0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67  turn rc;..  pPag
6ce0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
6cf0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
6d00: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
6d10: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
6d20: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
6d30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
6d40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6d50: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
6d60: 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65  e supplied maste
6d70: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
6d80: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
6d90: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a  file for pager.*
6da0: 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20  * pPager at the 
6db0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6dc0: 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
6dd0: 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62  rnal name must b
6de0: 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68  e the last.** th
6df0: 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ing written to a
6e00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6e10: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
6e20: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
6e30: 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  , the.** journal
6e40: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6e50: 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20   is advanced to 
6e60: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
6e70: 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a  boundary before.
6e80: 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77  ** anything is w
6e90: 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d  ritten. The form
6ea0: 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34  at is:.**.** + 4
6eb0: 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
6ec0: 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79  _PGNO..** + N by
6ed0: 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d  tes: length of m
6ee0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6ef0: 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  me..** + 4 bytes
6f00: 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  : N.** + 4 bytes
6f10: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
6f20: 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
6f30: 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a  ** + 8 bytes: aJ
6f40: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
6f50: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
6f60: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
6f70: 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
6f80: 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
6f90: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
6fa0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a  ournal name..**.
6fb0: 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73  ** If zMaster is
6fc0: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
6fd0: 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69  (occurs for a si
6fe0: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
6ff0: 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20  ansaction), .** 
7000: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
7010: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
7020: 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a  int writeMasterJ
7030: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
7040: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
7050: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
7060: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  t rc;.  int len;
7070: 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33   .  int i; .  u3
7080: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63  2 cksum = 0;.  c
7090: 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28  har zBuf[sizeof(
70a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
70b0: 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61  *4];..  if( !zMa
70c0: 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ster || pPager->
70d0: 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72  setMaster) retur
70e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
70f0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
7100: 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73   = 1;..  len = s
7110: 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a  trlen(zMaster);.
7120: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
7130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
7140: 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m += zMaster[i];
7150: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
7160: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
7170: 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
7180: 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
7190: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
71a0: 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
71b0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
71c0: 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
71d0: 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
71e0: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
71f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
7200: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
7210: 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
7220: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
7230: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65   ){.    rc = see
7240: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
7250: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
7260: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7270: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
7280: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7290: 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20   += (len+20);.. 
72a0: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
72b0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50  s(pPager->jfd, P
72c0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
72d0: 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21  ger));.  if( rc!
72e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
72f0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
7300: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7310: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
7320: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
7330: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
7340: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
7350: 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c  ut32bits(zBuf, l
7360: 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  en);.  put32bits
7370: 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d  (&zBuf[4], cksum
7380: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  );.  memcpy(&zBu
7390: 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  f[8], aJournalMa
73a0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
73b0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72  rnalMagic));.  r
73c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
73d0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
73e0: 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61  zBuf, 8+sizeof(a
73f0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
7400: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
7410: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
7420: 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72  Sync;.  return r
7430: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
7440: 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65  or remove a page
7450: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
7460: 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74  f all pages that
7470: 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73   are in the.** s
7480: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
7490: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  ..**.** The Page
74a0: 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61  r keeps a separa
74b0: 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  te list of pages
74c0: 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
74d0: 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74  tly in.** the st
74e0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
74f0: 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65    This helps the
7500: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
7510: 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72  mt_commit().** r
7520: 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20  outine run MUCH 
7530: 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63  faster for the c
7540: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
7550: 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a   there are many.
7560: 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f  ** pages in memo
7570: 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65  ry but only a fe
7580: 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  w are in the sta
7590: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
75a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
75b0: 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
75c0: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
75d0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
75e0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
75f0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 53 74  .  if( pPg->inSt
7600: 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  mt ) return;.  a
7610: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65  ssert( pPg->pPre
7620: 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d  vStmt==0 && pPg-
7630: 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b  >pNextStmt==0 );
7640: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
7650: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  t = 0;.  if( pPa
7660: 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ger->pStmt ){.  
7670: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d    pPager->pStmt-
7680: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
7690: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
76a0: 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d  xtStmt = pPager-
76b0: 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61 67 65 72  >pStmt;.  pPager
76c0: 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  ->pStmt = pPg;. 
76d0: 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31   pPg->inStmt = 1
76e0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
76f0: 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d  page_remove_from
7700: 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72  _stmt_list(PgHdr
7710: 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 21 70   *pPg){.  if( !p
7720: 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74  Pg->inStmt ) ret
7730: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
7740: 70 50 72 65 76 53 74 6d 74 20 29 7b 0a 20 20 20  pPrevStmt ){.   
7750: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
7760: 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74  revStmt->pNextSt
7770: 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  mt==pPg );.    p
7780: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70  Pg->pPrevStmt->p
7790: 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e  NextStmt = pPg->
77a0: 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c  pNextStmt;.  }el
77b0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
77c0: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74  pPg->pPager->pSt
77d0: 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  mt==pPg );.    p
77e0: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d  Pg->pPager->pStm
77f0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
7800: 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  mt;.  }.  if( pP
7810: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a  g->pNextStmt ){.
7820: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
7830: 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65  >pNextStmt->pPre
7840: 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  vStmt==pPg );.  
7850: 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74    pPg->pNextStmt
7860: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
7870: 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a 20 20  g->pPrevStmt;.  
7880: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  }.  pPg->pNextSt
7890: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  mt = 0;.  pPg->p
78a0: 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20  PrevStmt = 0;.  
78b0: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pPg->inStmt = 0;
78c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
78d0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
78e0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
78f0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
7900: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
7910: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
7920: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
7930: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
7940: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
7950: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
7960: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
7970: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28   PgHdr *p;.  if(
7980: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d   pPager->aHash==
7990: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
79a0: 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  p = pPager->aHas
79b0: 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  h[pgno & (pPager
79c0: 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77  ->nHash-1)];.  w
79d0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67  hile( p && p->pg
79e0: 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  no!=pgno ){.    
79f0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68  p = p->pNextHash
7a00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7a10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
7a20: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
7a30: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  ile..**.** Once 
7a40: 61 6c 6c 20 6c 6f 63 6b 73 20 68 61 76 65 20 62  all locks have b
7a50: 65 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  een removed from
7a60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7a70: 6c 65 2c 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  le, other.** pro
7a80: 63 65 73 73 65 73 20 6f 72 20 74 68 72 65 61 64  cesses or thread
7a90: 73 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  s might change t
7aa0: 68 65 20 66 69 6c 65 2e 20 20 53 6f 20 6d 61 6b  he file.  So mak
7ab0: 65 20 73 75 72 65 20 61 6c 6c 20 6f 66 0a 2a 2a  e sure all of.**
7ac0: 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 63 61   our internal ca
7ad0: 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64 61 74  che is invalidat
7ae0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
7af0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
7b00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7b10: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
7b20: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
7b30: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
7b40: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  NO_LOCK);.    pP
7b50: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
7b60: 31 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  1;.    IOTRACE((
7b70: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
7b80: 50 61 67 65 72 29 29 0a 20 20 7d 0a 20 20 70 50  Pager)).  }.  pP
7b90: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
7ba0: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 61 73  GER_UNLOCK;.  as
7bb0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 41  sert( pPager->pA
7bc0: 6c 6c 3d 3d 30 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ll==0 );.}.../*.
7bd0: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
7be0: 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72  tabase and clear
7bf0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
7c00: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
7c10: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
7c20: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
7c30: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
7c40: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
7c50: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
7c60: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
7c70: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
7c80: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
7c90: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
7ca0: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
7cb0: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
7cc0: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
7cd0: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
7ce0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7cf0: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
7d00: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
7d10: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
7d20: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
7d30: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
7d40: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
7d50: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
7d60: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
7d70: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
7d80: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  l;.    sqliteFre
7d90: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50  e(pPg);.  }.  pP
7da0: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
7db0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
7dc0: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20  stSynced = 0;.  
7dd0: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
7de0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
7df0: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
7e00: 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71  >nHash = 0;.  sq
7e10: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
7e20: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
7e30: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
7e40: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
7e50: 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
7e60: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
7e70: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
7e80: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
7e90: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
7ea0: 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
7eb0: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
7ec0: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61  r->nRef = 0;.  a
7ed0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
7ee0: 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65  rrCode || (pPage
7ef0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
7f00: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d  0 && pPager->stm
7f10: 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 7d 0a 0a  tOpen==0) );.}..
7f20: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
7f30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7f40: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
7f50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7f60: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
7f70: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
7f80: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
7f90: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
7fa0: 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65 61 73  s routine releas
7fb0: 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
7fc0: 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75  se lock and acqu
7fd0: 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f  ires a SHARED lo
7fe0: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ck in its place.
7ff0: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a    The journal.**
8000: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
8010: 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a   and closed..**.
8020: 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65  ** TODO: Conside
8030: 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f  r keeping the jo
8040: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
8050: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  for temporary da
8060: 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73  tabases..** This
8070: 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
8080: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
8090: 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73  ement on windows
80a0: 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a   where opening.*
80b0: 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65  * a file is an e
80c0: 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
80d0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
80e0: 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  t pager_unwritel
80f0: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
8100: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
8110: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
8120: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
8130: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8140: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
8150: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
8160: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8170: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
8180: 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65  tmt_commit(pPage
8190: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
81a0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
81b0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
81c0: 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  (&pPager->stfd);
81d0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
81e0: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20  tOpen = 0;.  }. 
81f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8200: 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
8210: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
8220: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
8230: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8240: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73  lOpen = 0;.    s
8250: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
8260: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
8270: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
8280: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
8290: 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
82a0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
82b0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   0;.    for(pPg=
82c0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
82d0: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
82e0: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
82f0: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
8300: 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
8310: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
8320: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
8330: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
8340: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
8350: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
8360: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
8370: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
8380: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
8390: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
83a0: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
83b0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
83c0: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
83d0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
83e0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
83f0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
8400: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
8410: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
8420: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
8430: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63  l==0 );.  }.  rc
8440: 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   = sqlite3OsUnlo
8450: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
8460: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70  HARED_LOCK);.  p
8470: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
8480: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 70  AGER_SHARED;.  p
8490: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
84a0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
84b0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
84c0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
84d0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
84e0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
84f0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
8500: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
8510: 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
8520: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
8530: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
8540: 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20   a checksum for 
8550: 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61  the page of data
8560: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
8570: 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
8580: 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c  sum.  It is real
8590: 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
85a0: 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
85b0: 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
85c0: 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  and the page num
85d0: 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d  ber.  We experim
85e0: 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  ented with.** a 
85f0: 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20  checksum of the 
8600: 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74  entire data, but
8610: 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20   that was found 
8620: 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a  to be too slow..
8630: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
8640: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
8650: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8660: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
8670: 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68  ta and.** the ch
8680: 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64  ecksum is stored
8690: 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
86a0: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  is is important.
86b0: 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20    If journal.** 
86c0: 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
86d0: 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
86e0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
86f0: 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72  st likely scenar
8700: 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e  io.** is that on
8710: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
8720: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
8730: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
8740: 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68  .  It is.** much
8750: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
8760: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
8770: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
8780: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
8790: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
87a0: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
87b0: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
87c0: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
87d0: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
87e0: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
87f0: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
8800: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
8810: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  orruption..**.**
8820: 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64   FIX ME:  Consid
8830: 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20  er adding every 
8840: 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79  200th (or so) by
8850: 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74  te of the data t
8860: 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75  o the.** checksu
8870: 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20  m.  That way if 
8880: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70  a single page sp
8890: 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69  ans 3 or more di
88a0: 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a  sk sectors and.*
88b0: 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c  * only the middl
88c0: 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72  e sector is corr
88d0: 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  upt, we will sti
88e0: 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e  ll have a reason
88f0: 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f  able.** chance o
8900: 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68  f failing the ch
8910: 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20  ecksum and thus 
8920: 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72  detecting the pr
8930: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  oblem..*/.static
8940: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
8950: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8960: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
8970: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
8980: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
8990: 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  t;.  int i = pPa
89a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
89b0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  0;.  while( i>0 
89c0: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
89d0: 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
89e0: 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
89f0: 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
8a00: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
8a10: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
8a20: 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50  void makeClean(P
8a30: 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52  gHdr*);../*.** R
8a40: 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67  ead a single pag
8a50: 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
8a60: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f  al file opened o
8a70: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
8a80: 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62  r.** jfd.  Playb
8a90: 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67  ack this one pag
8aa0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43  e..**.** If useC
8ab0: 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73  ksum==0 it means
8ac0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f   this journal do
8ad0: 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b  es not use check
8ae0: 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73  sums.  Checksums
8af0: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64  .** are not used
8b00: 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   in statement jo
8b10: 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73  urnals because s
8b20: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8b30: 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64  s do not.** need
8b40: 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65   to survive powe
8b50: 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73  r failures..*/.s
8b60: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
8b70: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
8b80: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
8b90: 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e   OsFile *jfd, in
8ba0: 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69  t useCksum){.  i
8bb0: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
8bc0: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
8bd0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
8be0: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
8bf0: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
8c00: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
8c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8c20: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
8c30: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
8c40: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
8c50: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
8c60: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
8c70: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
8c80: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
8c90: 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20  u8 *aData = (u8 
8ca0: 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
8cb0: 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73  ace;   /* Temp s
8cc0: 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67  torage for a pag
8cd0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b  e */..  /* useCk
8ce0: 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72  sum should be tr
8cf0: 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  ue for the main 
8d00: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73  journal and fals
8d10: 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  e for.  ** state
8d20: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20  ment journals.  
8d30: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
8d40: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63   is always the c
8d50: 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ase.  */.  asser
8d60: 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b  t( jfd == (useCk
8d70: 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  sum ? pPager->jf
8d80: 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64  d : pPager->stfd
8d90: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ) );.  assert( a
8da0: 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Data );..  rc = 
8db0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
8dc0: 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
8dd0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8de0: 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
8df0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
8e00: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
8e10: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  ->pageSize);.  i
8e20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8e30: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
8e40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8e50: 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
8e60: 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f  geSize + 4;..  /
8e70: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
8e80: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
8e90: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
8ea0: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
8eb0: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
8ec0: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
8ed0: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
8ee0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
8ef0: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
8f00: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
8f10: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
8f20: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
8f30: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
8f40: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
8f50: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
8f60: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
8f70: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
8f80: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
8f90: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
8fa0: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
8fb0: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
8fc0: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
8fd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8fe0: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
8ff0: 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50  gno>(unsigned)pP
9000: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
9010: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9020: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
9030: 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20  useCksum ){.    
9040: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
9050: 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  jfd, &cksum);.  
9060: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9070: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
9080: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9090: 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  4;.    if( pager
90a0: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
90b0: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
90c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
90d0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
90e0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
90f0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
9100: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
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 29  AGER_EXCLUSIVE )
9130: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
9140: 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
9150: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
9160: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
9170: 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
9180: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
9190: 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
91a0: 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
91b0: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
91c0: 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
91d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
91e0: 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
91f0: 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
9200: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
9210: 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
9220: 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
9230: 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
9240: 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
9250: 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
9260: 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
9270: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
9280: 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
9290: 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  rty..  **.  ** T
92a0: 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
92b0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
92c0: 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
92d0: 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
92e0: 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
92f0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
9300: 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
9310: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
9320: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
9330: 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
9340: 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
9350: 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
9360: 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
9370: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
9380: 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
9390: 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
93a0: 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
93b0: 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
93c0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
93d0: 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
93e0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
93f0: 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
9400: 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
9410: 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
9420: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
9430: 65 6e 74 73 20 61 72 65 20 69 6e 20 74 68 65 20  ents are in the 
9440: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
9450: 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
9460: 65 72 77 69 73 65 2c 20 69 66 20 61 20 66 75 6c  erwise, if a ful
9470: 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72  l ROLLBACK occur
9480: 73 20 61 66 74 65 72 20 74 68 65 20 73 74 61 74  s after the stat
9490: 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62  ement.  ** rollb
94a0: 61 63 6b 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c  ack the full ROL
94b0: 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72  LBACK will not r
94c0: 65 73 74 6f 72 65 20 74 68 65 20 70 61 67 65 20  estore the page 
94d0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
94e0: 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54    ** content.  T
94f0: 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
9500: 73 74 20 62 65 20 6d 65 74 20 62 65 66 6f 72 65  st be met before
9510: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
9520: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69  database.  ** fi
9530: 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
9540: 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 6c 6f  abase must be lo
9550: 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
9560: 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
9570: 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63  inal.  ** page c
9580: 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20 74 68 65  ontent is in the
9590: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
95a0: 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
95b0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a   page is not in.
95c0: 20 20 2a 2a 20 63 61 63 68 65 20 6f 72 20 65 6c    ** cache or el
95d0: 73 65 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20  se it is marked 
95e0: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
95f0: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67    */.  pPg = pag
9600: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
9610: 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
9620: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
9630: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
9640: 45 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20  E || pPg!=0 );. 
9650: 20 54 52 41 43 45 33 28 22 50 4c 41 59 42 41 43   TRACE3("PLAYBAC
9660: 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  K %d page %d\n",
9670: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
9680: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
9690: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
96a0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
96b0: 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d   (pPg==0 || pPg-
96c0: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b  >needSync==0) ){
96d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
96e0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
96f0: 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  fd, (pgno-1)*(i6
9700: 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
9710: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ze);.    if( rc=
9720: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9730: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9740: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
9750: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
9760: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9770: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20    }.    if( pPg 
9780: 29 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  ){.      makeCle
9790: 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  an(pPg);.    }. 
97a0: 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
97b0: 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
97c0: 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
97d0: 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
97e0: 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
97f0: 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
9800: 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
9810: 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
9820: 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
9830: 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
9840: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
9850: 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
9860: 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
9870: 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
9880: 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
9890: 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
98a0: 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
98b0: 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
98c0: 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
98d0: 20 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72   ** sqlite3pager
98e0: 5f 72 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  _rollback()..   
98f0: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
9900: 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65  ata;.    /* asse
9910: 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
9920: 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31   || pPg->pgno==1
9930: 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61   ); */.    pData
9940: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
9950: 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70  (pPg);.    memcp
9960: 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20  y(pData, aData, 
9970: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9980: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
9990: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
99a0: 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20  {  /*** FIX ME: 
99b0: 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65 20   Should this be 
99c0: 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20  xReinit? ***/.  
99d0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
99e0: 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70  tructor(pData, p
99f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9a00: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
9a10: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
9a20: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
9a30: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
9a40: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
9a50: 66 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  f.    CODEC1(pPa
9a60: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
9a70: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20  >pgno, 3);.  }. 
9a80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9a90: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
9aa0: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
9ab0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
9ac0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
9ad0: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
9ae0: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
9af0: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
9b00: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
9b10: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
9b20: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
9b30: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
9b40: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
9b50: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
9b60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9b70: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
9b80: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
9b90: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
9ba0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
9bb0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
9bc0: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
9bd0: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
9be0: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
9bf0: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
9c00: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
9c10: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
9c20: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
9c30: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
9c40: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
9c50: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
9c60: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
9c70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
9c80: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
9c90: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
9ca0: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
9cb0: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
9cc0: 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ster(const char 
9cd0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
9ce0: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
9cf0: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73  r_open = 0;.  Os
9d00: 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30  File *master = 0
9d10: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
9d20: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
9d30: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
9d40: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9d50: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
9d60: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
9d70: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
9d80: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
9d90: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
9da0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9db0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
9dc0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
9dd0: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
9de0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
9df0: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
9e00: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
9e10: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
9e20: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ence..  */.  rc 
9e30: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
9e40: 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c  eadOnly(zMaster,
9e50: 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28   &master);.  if(
9e60: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9e70: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
9e80: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
9e90: 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  en = 1;.  rc = s
9ea0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
9eb0: 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  (master, &nMaste
9ec0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
9ed0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9ee0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
9ef0: 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
9f00: 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
9f10: 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
9f20: 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
9f30: 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20  asterPtr = 0;.. 
9f40: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
9f50: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
9f60: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
9f70: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
9f80: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
9f90: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69  Malloc() and poi
9fa0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
9fb0: 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  erJournal. .    
9fc0: 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f  */.    zMasterJo
9fd0: 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29  urnal = (char *)
9fe0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61  sqliteMalloc(nMa
9ff0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
a000: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
a010: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
a020: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
a030: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
a040: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
a050: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
a060: 65 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c  e3OsRead(master,
a070: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
a080: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29   nMasterJournal)
a090: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
a0a0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
a0b0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
a0c0: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
a0d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
a0e0: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
a0f0: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
a100: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
a110: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  l ){.      if( s
a120: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
a130: 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  ts(zJournal) ){.
a140: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
a150: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
a160: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
a170: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a180: 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
a190: 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
a1a0: 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
a1b0: 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
a1c0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
a1d0: 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
a1e0: 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
a1f0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
a200: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
a210: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f      */.        O
a220: 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d  sFile *journal =
a230: 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
a240: 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  c;..        rc =
a250: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
a260: 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c  adOnly(zJournal,
a270: 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20   &journal);.    
a280: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a290: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a2a0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
a2b0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
a2c0: 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ..        rc = r
a2d0: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
a2e0: 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74  (journal, &zMast
a2f0: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
a300: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
a310: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
a320: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a330: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
a340: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
a350: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
a360: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
a370: 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72  terPtr!=0 && str
a380: 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
a390: 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
a3a0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
a3b0: 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  zMasterPtr);.   
a3c0: 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
a3d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
a3e0: 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
a3f0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
a400: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a410: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
a420: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a430: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
a440: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75      }.      zJou
a450: 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28  rnal += (strlen(
a460: 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
a470: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c    }.  }.  .  sql
a480: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
a490: 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  ster);..delmaste
a4a0: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
a4b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
a4c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
a4d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
a4e0: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
a4f0: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
a500: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
a510: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
a520: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a530: 20 4d 61 6b 65 20 65 76 65 72 79 20 70 61 67 65   Make every page
a540: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 67   in the cache ag
a550: 72 65 65 20 77 69 74 68 20 77 68 61 74 20 69 73  ree with what is
a560: 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74   on disk.  In ot
a570: 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65  her words,.** re
a580: 72 65 61 64 20 74 68 65 20 64 69 73 6b 20 74 6f  read the disk to
a590: 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74 65   reset the state
a5a0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   of the cache..*
a5b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a5c0: 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
a5d0: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20  r a rollback in 
a5e0: 77 68 69 63 68 20 73 6f 6d 65 20 6f 66 20 74 68  which some of th
a5f0: 65 20 64 69 72 74 79 20 63 61 63 68 65 0a 2a 2a  e dirty cache.**
a600: 20 70 61 67 65 73 20 68 61 64 20 6e 65 76 65 72   pages had never
a610: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f 75   been written ou
a620: 74 20 74 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e  t to disk.  We n
a630: 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  eed to roll back
a640: 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f   the.** cache co
a650: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 65 61  ntent and the ea
a660: 73 69 65 73 74 20 77 61 79 20 74 6f 20 64 6f 20  siest way to do 
a670: 74 68 61 74 20 69 73 20 74 6f 20 72 65 72 65 61  that is to rerea
a680: 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e  d the old conten
a690: 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74  t.** back from t
a6a0: 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  he disk..*/.stat
a6b0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 6c  ic int pager_rel
a6c0: 6f 61 64 5f 63 61 63 68 65 28 50 61 67 65 72 20  oad_cache(Pager 
a6d0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
a6e0: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
a6f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a700: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
a710: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
a720: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
a730: 20 20 20 63 68 61 72 20 2a 7a 42 75 66 20 3d 20     char *zBuf = 
a740: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
a750: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  e;        /* Tem
a760: 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 6f 6e  p storage for on
a770: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66  e page */.    if
a780: 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20  ( !pPg->dirty ) 
a790: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
a7a0: 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
a7b0: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
a7c0: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
a7d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
a7e0: 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ek(pPager->fd, p
a7f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
a800: 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d  (i64)(pPg->pgno-
a810: 31 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  1));.      if( r
a820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a830: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
a840: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
a850: 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
a860: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
a880: 41 43 45 33 28 22 52 45 46 45 54 43 48 20 25 64  ACE3("REFETCH %d
a890: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
a8a0: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
a8b0: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
a8c0: 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
a8d0: 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
a8e0: 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e  ger, zBuf, pPg->
a8f0: 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65  pgno, 2);.    }e
a900: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
a910: 74 28 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65  t(zBuf, 0, pPage
a920: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a930: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
a940: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63  >nRef==0 || memc
a950: 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54  mp(zBuf, PGHDR_T
a960: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
a970: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
a980: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50  {.      memcpy(P
a990: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
a9a0: 29 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  ), zBuf, pPager-
a9b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
a9c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
a9d0: 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
a9e0: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
a9f0: 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41  iter(PGHDR_TO_DA
aa00: 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
aa10: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
aa20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
aa30: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
aa40: 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
aa50: 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
aa60: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
aa70: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
aa80: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
aa90: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
aaa0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
aab0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
aac0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
aad0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
aae0: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
aaf0: 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
ab00: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
ab10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
ab20: 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69  cate the main fi
ab30: 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  le of the given 
ab40: 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d  pager to the num
ab50: 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
ab60: 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74  indicated..*/.st
ab70: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
ab80: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
ab90: 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65  Pager, int nPage
aba0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
abb0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
abc0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  R_EXCLUSIVE );. 
abd0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
abe0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
abf0: 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61  ->fd, pPager->pa
ac00: 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
ac10: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  e);.}../*.** Pla
ac20: 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
ac30: 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
ac40: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
ac50: 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
ac60: 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
ac70: 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
ac80: 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
ac90: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
aca0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
acb0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
acc0: 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
acd0: 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
ace0: 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
acf0: 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
ad00: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
ad10: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
ad20: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
ad30: 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
ad40: 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
ad50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
ad60: 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
ad70: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
ad80: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
ad90: 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
ada0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
adb0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
adc0: 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
add0: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
ade0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
adf0: 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
ae00: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
ae10: 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
ae20: 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
ae30: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
ae40: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
ae50: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
ae60: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
ae70: 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
ae80: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
ae90: 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
aea0: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
aeb0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
aec0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
aed0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
aee0: 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
aef0: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
af00: 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
af10: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
af20: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
af30: 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20  urnal.).**  (6) 
af40: 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
af50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
af60: 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
af70: 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
af80: 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
af90: 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
afa0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
afb0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
afc0: 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
afd0: 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
afe0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
aff0: 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
b000: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
b010: 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
b020: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
b030: 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
b040: 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29  n UTF-8..**  (7)
b050: 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
b060: 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
b070: 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
b080: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
b090: 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
b0a0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
b0b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
b0c0: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
b0d0: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
b0e0: 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
b0f0: 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
b100: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
b110: 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
b120: 68 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73  he first 6 items
b130: 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
b140: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
b150: 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
b160: 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69  nce of the 7th i
b170: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
b180: 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
b190: 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
b1a0: 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
b1b0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
b1c0: 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
b1d0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
b1e0: 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
b1f0: 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
b200: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
b210: 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
b220: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
b230: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
b240: 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
b250: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
b260: 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
b270: 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
b280: 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
b290: 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
b2a0: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
b2b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b2c0: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
b2d0: 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
b2e0: 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
b2f0: 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
b300: 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
b310: 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
b320: 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
b330: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
b340: 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
b350: 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
b360: 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
b370: 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
b380: 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
b390: 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
b3a0: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
b3b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
b3c0: 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
b3d0: 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
b3e0: 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
b3f0: 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
b400: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
b410: 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
b420: 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
b430: 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
b440: 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
b450: 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
b460: 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
b470: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
b480: 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
b490: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
b4a0: 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
b4b0: 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
b4c0: 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
b4d0: 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
b4e0: 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
b4f0: 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
b500: 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
b510: 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
b520: 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
b530: 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
b540: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
b550: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
b560: 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
b570: 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
b580: 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
b590: 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
b5a0: 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
b5b0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
b5c0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
b5d0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
b5e0: 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
b5f0: 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
b600: 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
b610: 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
b620: 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
b630: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
b640: 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
b650: 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
b660: 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
b670: 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
b680: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
b690: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
b6a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
b6b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
b6c0: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
b6d0: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a  ager){.  i64 szJ
b6e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b6f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
b700: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
b710: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
b720: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
b730: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b740: 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
b750: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
b760: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
b770: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
b780: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
b790: 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
b7a0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b7b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
b7c0: 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
b7d0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
b7e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
b7f0: 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
b800: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61  routine */.  cha
b810: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
b820: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
b830: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b840: 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a  file if any */..
b850: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
b860: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
b870: 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
b880: 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
b890: 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
b8a0: 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
b8b0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
b8c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
b8d0: 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  en );.  rc = sql
b8e0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
b8f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
b900: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
b910: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
b920: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
b930: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
b940: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b950: 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
b960: 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
b970: 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
b980: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
b990: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
b9a0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
b9b0: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
b9c0: 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
b9d0: 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
b9e0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
b9f0: 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
ba00: 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
ba10: 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
ba20: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  /.  rc = readMas
ba30: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
ba40: 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72  r->jfd, &zMaster
ba50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
ba60: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
ba70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ba80: 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20  _OK || (zMaster 
ba90: 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  && !sqlite3OsFil
baa0: 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29  eExists(zMaster)
bab0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ) ){.    sqliteF
bac0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
bad0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
bae0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
baf0: 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
bb00: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
bb10: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
bb20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
bb30: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
bb40: 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   0);.  pPager->j
bb50: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
bb60: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
bb70: 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
bb80: 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
bb90: 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
bba0: 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
bbb0: 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
bbc0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
bbd0: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
bbe0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
bbf0: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
bc00: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
bc10: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
bc20: 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
bc30: 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
bc40: 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
bc50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
bc60: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
bc70: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
bc80: 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
bc90: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
bca0: 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
bcb0: 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
bcc0: 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
bcd0: 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
bce0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
bcf0: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
bd00: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
bd10: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
bd20: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
bd30: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
bd40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
bd50: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
bd60: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
bd70: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
bd80: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
bd90: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
bda0: 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
bdb0: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
bdc0: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
bdd0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
bde0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
bdf0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
be00: 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
be10: 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
be20: 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
be30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
be40: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
be50: 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
be60: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
be70: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
be80: 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
be90: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
bea0: 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
beb0: 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
bec0: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
bed0: 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
bee0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
bef0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
bf00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
bf10: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
bf20: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
bf30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
bf40: 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
bf50: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
bf60: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
bf70: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
bf80: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
bf90: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
bfa0: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
bfb0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
bfc0: 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67  ack to it's orig
bfd0: 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a  inal size..    *
bfe0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
bff0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
c000: 58 43 4c 55 53 49 56 45 20 26 26 20 0a 20 20 20  XCLUSIVE && .   
c010: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
c020: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
c030: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
c040: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c050: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
c060: 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ize==0 || pPager
c070: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78  ->origDbSize==mx
c080: 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pg );.      rc =
c090: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
c0a0: 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
c0b0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c0c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c0d0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
c0e0: 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
c0f0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
c100: 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
c110: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
c120: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
c130: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
c140: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
c150: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
c160: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
c170: 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
c180: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
c190: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
c1a0: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
c1b0: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
c1c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c1d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
c1e0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c1f0: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
c200: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
c210: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
c220: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c230: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
c240: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
c250: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c260: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  /* If we are una
c270: 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
c280: 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 74  a hot journal, t
c290: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
c2a0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
c2b0: 20 70 72 6f 62 61 62 6c 79 20 6e 6f 74 20 72 65   probably not re
c2c0: 63 6f 76 65 72 61 62 6c 65 2e 20 20 52 65 74 75  coverable.  Retu
c2d0: 72 6e 20 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  rn CORRUPT..    
c2e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
c2f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
c300: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
c310: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
c320: 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
c330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
c340: 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
c350: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
c360: 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
c370: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c380: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
c390: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
c3a0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
c3b0: 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a   if( zMaster ){.
c3c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
c3d0: 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
c3e0: 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
c3f0: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
c400: 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73  n true,.    ** s
c410: 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
c420: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
c430: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c440: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
c450: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c460: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c470: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d  ger_delmaster(zM
c480: 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  aster);.    }.  
c490: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
c4a0: 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster);.  }..  /*
c4b0: 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
c4c0: 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
c4d0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
c4e0: 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
c4f0: 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
c500: 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
c510: 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
c520: 20 61 20 64 69 66 66 65 72 65 6e 74 20 50 41 47   a different PAG
c530: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  ER_SECTOR_SIZE. 
c540: 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
c550: 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
c560: 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
c570: 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
c580: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
c590: 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43  Size = PAGER_SEC
c5a0: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75  TOR_SIZE;.  retu
c5b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c5c0: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61  Playback the sta
c5d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
c5e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
c5f0: 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
c600: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
c610: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
c620: 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
c630: 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
c640: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
c650: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
c660: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
c670: 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
c680: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
c690: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
c6a0: 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
c6b0: 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74  r->stmtSize, not
c6c0: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
c6d0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
c6e0: 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20  itself..**.**   
c6f0: 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f   (2)  In additio
c700: 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  n to playing bac
c710: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
c720: 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a  journal, also.**
c730: 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63           playbac
c740: 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  k all pages of t
c750: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
c760: 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67  ournal beginning
c770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f  .**         at o
c780: 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74  ffset pPager->st
c790: 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  mtJSize..*/.stat
c7a0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d  ic int pager_stm
c7b0: 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  t_playback(Pager
c7c0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
c7d0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
c7e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
c7f0: 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
c800: 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66  l */.  i64 hdrOf
c810: 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  f;.  int nRec;  
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c830: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
c840: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c860: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c870: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
c880: 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
c890: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64  ournalOff;.#ifnd
c8a0: 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20  ef NDEBUG .  {. 
c8b0: 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20     i64 os_szJ;. 
c8c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c8d0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
c8e0: 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b  ->jfd, &os_szJ);
c8f0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c900: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
c910: 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
c920: 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20  szJ==os_szJ );. 
c930: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
c940: 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65  Set hdrOff to be
c950: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c960: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
c970: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 0a   header written.
c980: 20 20 2a 2a 20 74 68 69 73 20 73 74 61 74 65 6d    ** this statem
c990: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
c9a0: 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74   or the end of t
c9b0: 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f  he file if no jo
c9c0: 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  urnal.  ** heade
c9d0: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20  r was written.. 
c9e0: 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70   */.  hdrOff = p
c9f0: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
ca00: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f;.  assert( pPa
ca10: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c  ger->fullSync ||
ca20: 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66   !hdrOff );.  if
ca30: 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20  ( !hdrOff ){.   
ca40: 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20   hdrOff = szJ;. 
ca50: 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63   }.  .  /* Trunc
ca60: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
ca70: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
ca80: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
ca90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
caa0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
cab0: 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20  USIVE ){.    rc 
cac0: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
cad0: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
cae0: 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 7d 0a  >stmtSize);.  }.
caf0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
cb00: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
cb10: 48 41 52 45 44 20 29 3b 0a 20 20 70 50 61 67 65  HARED );.  pPage
cb20: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
cb30: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20  er->stmtSize;.. 
cb40: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
cb50: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
cb60: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
cb70: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
cb80: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
cb90: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
cba0: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
cbb0: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
cbc0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
cbd0: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65  >stfd, 0);.  nRe
cbe0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
cbf0: 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
cc00: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
cc10: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
cc20: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
cc30: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
cc40: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
cc50: 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
cc60: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
cc70: 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
cc80: 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
cc90: 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
cca0: 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
ccb0: 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
ccc0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
ccd0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
cce0: 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
ccf0: 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b  (i=nRec-1; i>=0;
cd00: 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20   i--){.    rc = 
cd10: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
cd20: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
cd30: 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
cd40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
cd50: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
cd60: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
cd70: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
cd80: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
cd90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72  .  }..  /* Now r
cda0: 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62  oll some pages b
cdb0: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61  ack from the tra
cdc0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
cdd0: 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a  . Pager.stmtJSiz
cde0: 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73  e.  ** was the s
cdf0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
ce00: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  al file when thi
ce10: 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  s statement was 
ce20: 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a  started, so.  **
ce30: 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65   everything afte
ce40: 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  r that needs to 
ce50: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  be rolled back, 
ce60: 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a  either into the.
ce70: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74    ** database, t
ce80: 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c  he memory cache,
ce90: 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20   or both..  **. 
cea0: 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   ** If it is not
ceb0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65   zero, then Page
cec0: 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20  r.stmtHdrOff is 
ced0: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
cee0: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
cef0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
cf00: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
cf10: 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61   during this sta
cf20: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
cf30: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
cf40: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
cf50: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
cf60: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
cf70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cf80: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
cf90: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
cfa0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
cfb0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61  journalOff = pPa
cfc0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a  ger->stmtJSize;.
cfd0: 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49    pPager->cksumI
cfe0: 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  nit = pPager->st
cff0: 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72  mtCksum;.  asser
d000: 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  t( JOURNAL_HDR_S
d010: 5a 28 70 50 61 67 65 72 29 3c 28 70 50 61 67 65  Z(pPager)<(pPage
d020: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29  r->pageSize+8) )
d030: 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
d040: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d  r->journalOff <=
d050: 20 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72   (hdrOff-(pPager
d060: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29  ->pageSize+8)) )
d070: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d080: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d090: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
d0a0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
d0b0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d0c0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
d0d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d0e0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
d0f0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
d100: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
d110: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
d120: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
d130: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
d140: 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
d150: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
d160: 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
d170: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
d180: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
d190: 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
d1a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d1b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d1c0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d1d0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
d1e0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d1f0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
d200: 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
d210: 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
d220: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
d230: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
d240: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
d250: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
d260: 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
d270: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
d280: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
d290: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
d2a0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d2b0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
d2c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
d2d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d2e0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d2f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d300: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
d310: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d320: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
d330: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d340: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
d350: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
d360: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
d370: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
d380: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d390: 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
d3a0: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
d3b0: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
d3c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d3d0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
d3e0: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
d3f0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
d400: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
d410: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
d420: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61  ite3pager_set_ca
d430: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
d440: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
d450: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
d460: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
d470: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
d480: 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
d490: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
d4a0: 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = 10;.  }.}../*.
d4b0: 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
d4c0: 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
d4d0: 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
d4e0: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
d4f0: 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
d500: 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
d510: 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
d520: 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
d530: 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
d540: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d550: 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
d560: 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
d570: 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
d580: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
d590: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
d5a0: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
d5b0: 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
d5c0: 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
d5d0: 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
d5e0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
d5f0: 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
d600: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
d610: 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
d620: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
d630: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d640: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
d650: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
d660: 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
d670: 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
d680: 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
d690: 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
d6a0: 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
d6b0: 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
d6c0: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
d6d0: 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
d6e0: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
d6f0: 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
d700: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
d710: 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
d720: 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
d730: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
d740: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
d750: 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
d760: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
d770: 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
d780: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
d790: 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
d7a0: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
d7b0: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
d7c0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
d7d0: 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
d7e0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
d7f0: 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
d800: 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
d810: 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
d820: 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
d830: 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
d840: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
d860: 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
d870: 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
d880: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
d890: 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
d8a0: 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
d8b0: 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
d8c0: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
d8d0: 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
d8e0: 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
d8f0: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
d900: 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
d910: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d920: 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
d930: 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
d940: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
d950: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
d960: 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
d970: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
d980: 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
d990: 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
d9a0: 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
d9b0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
d9c0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
d9d0: 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
d9e0: 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65  e3pager_set_safe
d9f0: 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a  ty_level(Pager *
da00: 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
da10: 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  l, int full_fsyn
da20: 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  c){.  pPager->no
da30: 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
da40: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
da50: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
da60: 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
da70: 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
da80: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
da90: 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d  er->full_fsync =
daa0: 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69   full_fsync;.  i
dab0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
dac0: 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
dad0: 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  Sync = 0;.}.#end
dae0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
daf0: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
db00: 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
db10: 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
db20: 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
db30: 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
db40: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
db50: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
db60: 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
db70: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
db80: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
db90: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
dba0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
dbb0: 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
dbc0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
dbd0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
dbe0: 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rary file. .**.*
dbf0: 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
dc00: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
dc10: 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
dc20: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
dc30: 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
dc40: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
dc50: 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a  f we fail..**.**
dc60: 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
dc70: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
dc80: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
dc90: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a  file when it is.
dca0: 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ** closed..*/.st
dcb0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
dcc0: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 4f  pager_opentemp(O
dcd0: 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20  sFile **pFd){.  
dce0: 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69  int cnt = 8;.  i
dcf0: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 46  nt rc;.  char zF
dd00: 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ile[SQLITE_TEMPN
dd10: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 23 69 66 64  AME_SIZE];..#ifd
dd20: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
dd30: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
dd40: 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
dd50: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
dd60: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
dd70: 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 64 6f  y */.#endif.  do
dd80: 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20  {.    cnt--;.   
dd90: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
dda0: 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20  leName(zFile);. 
ddb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ddc0: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
ddd0: 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20  File, pFd, 1);. 
dde0: 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26   }while( cnt>0 &
ddf0: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc!=SQLITE_OK 
de00: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
de10: 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
de20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
de30: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
de40: 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
de50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
de60: 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
de70: 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
de80: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
de90: 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
dea0: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
deb0: 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
dec0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
ded0: 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  o sqlite3pager_g
dee0: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
def0: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
df00: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
df10: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
df20: 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72  ing sqlite3pager
df30: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  _unref()..**.** 
df40: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
df50: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
df60: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
df70: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
df80: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
df90: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
dfa0: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
dfb0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
dfc0: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
dfd0: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
dfe0: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
dff0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
e000: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
e010: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
e020: 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
e030: 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20  .** It is never 
e040: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
e050: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
e060: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
e070: 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  an.** in-memory 
e080: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
e090: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
e0a0: 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70  en(.  Pager **pp
e0b0: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
e0c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
e0d0: 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
e0e0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
e0f0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
e100: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
e110: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
e120: 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
e130: 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
e140: 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
e150: 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
e160: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
e170: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e190: 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
e1a0: 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
e1b0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
e1c0: 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  er = 0;.  char *
e1d0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e1e0: 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e  0;.  int nameLen
e1f0: 3b 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69  ;  /* Compiler i
e200: 73 20 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73  s wrong. This is
e210: 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
e220: 7a 65 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a  zed before use *
e230: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a  /.  OsFile *fd;.
e240: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e250: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
e260: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
e270: 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  0;.  int memDb =
e280: 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   0;.  int readOn
e290: 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73  ly = 0;.  int us
e2a0: 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
e2b0: 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
e2c0: 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e  OURNAL)==0;.  in
e2d0: 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
e2e0: 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
e2f0: 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20  _READLOCK)!=0;. 
e300: 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
e310: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
e320: 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
e330: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
e340: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41  ANAGEMENT.  /* A
e350: 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74   malloc() cannot
e360: 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33   fail in sqlite3
e370: 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20  ThreadData() as 
e380: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c  one or more call
e390: 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  s to .  ** mallo
e3a0: 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c  c() must have al
e3b0: 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20  ready been made 
e3c0: 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62  by this thread b
e3d0: 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20  efore it gets.  
e3e0: 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ** to this point
e3f0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
e400: 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74   ThreadData must
e410: 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
e420: 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a  ated already.  *
e430: 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64  * so that Thread
e440: 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20  Data.nAlloc can 
e450: 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64  be set. It would
e460: 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65   be nice to asse
e470: 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72  rt.  ** that Thr
e480: 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69  eadData.nAlloc i
e490: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20  s non-zero, but 
e4a0: 61 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b 73  alas this breaks
e4b0: 20 74 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a   test cases .  *
e4c0: 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76  * written to inv
e4d0: 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20 64 69  oke the pager di
e4e0: 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54  rectly..  */.  T
e4f0: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
e500: 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
e510: 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28  ata();.  assert(
e520: 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a   pTsd );.#endif.
e530: 0a 20 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28  .  /* If malloc(
e540: 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61  ) has already fa
e550: 69 6c 65 64 20 72 65 74 75 72 6e 20 53 51 4c 49  iled return SQLI
e560: 54 45 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65  TE_NOMEM. Before
e570: 20 65 76 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69   even.  ** testi
e580: 6e 67 20 66 6f 72 20 74 68 69 73 2c 20 73 65 74  ng for this, set
e590: 20 2a 70 70 50 61 67 65 72 20 74 6f 20 4e 55 4c   *ppPager to NUL
e5a0: 4c 20 73 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  L so the caller 
e5b0: 6b 6e 6f 77 73 20 74 68 65 20 70 61 67 65 72 0a  knows the pager.
e5c0: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 77    ** structure w
e5d0: 61 73 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74  as never allocat
e5e0: 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50  ed. .  */.  *ppP
e5f0: 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ager = 0;.  if( 
e600: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69  sqlite3MallocFai
e610: 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74  led() ){.    ret
e620: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e630: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
e640: 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64  fd, 0, sizeof(fd
e650: 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  ));..  /* Open t
e660: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e  he pager file an
e670: 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e  d set zFullPathn
e680: 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ame to point at 
e690: 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a  malloc()ed .  **
e6a0: 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69   memory containi
e6b0: 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ng the complete 
e6c0: 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69  filename (i.e. i
e6d0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72  ncluding the dir
e6e0: 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20  ectory)..  */.  
e6f0: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
e700: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
e710: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e720: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
e730: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
e740: 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
e750: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
e760: 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
e770: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e780: 73 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29  sqliteStrDup("")
e790: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
e7a0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
e7b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e7c0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
e7d0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
e7e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
e7f0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
e800: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e810: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
e820: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
e830: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
e840: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e850: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
e860: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
e870: 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20 20 20 20  ntemp(&fd);.    
e880: 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c  sqlite3OsTempFil
e890: 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20  eName(zTemp);.  
e8a0: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54    zFilename = zT
e8b0: 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61  emp;.    zFullPa
e8c0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
e8d0: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
e8e0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
e8f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e900: 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69   ){.      tempFi
e910: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  le = 1;.    }.  
e920: 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
e930: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
e940: 74 75 72 65 2e 20 41 73 20 70 61 72 74 20 6f 66  ture. As part of
e950: 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61   the same alloca
e960: 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20  tion, allocate. 
e970: 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68   ** space for th
e980: 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f 66 20  e full paths of 
e990: 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65 63 74  the file, direct
e9a0: 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ory and journal 
e9b0: 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69  .  ** (Pager.zFi
e9c0: 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44  lename, Pager.zD
e9d0: 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50 61 67  irectory and Pag
e9e0: 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20  er.zJournal)..  
e9f0: 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50 61  */.  if( zFullPa
ea00: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61  thname ){.    na
ea10: 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  meLen = strlen(z
ea20: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
ea30: 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
ea40: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
ea50: 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65  (*pPager) + name
ea60: 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20  Len*3 + 30 );.  
ea70: 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26 20    if( pPager && 
ea80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
ea90: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
eaa0: 54 6d 70 53 70 61 63 65 20 3d 20 28 63 68 61 72  TmpSpace = (char
eab0: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   *)sqliteMallocR
eac0: 61 77 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  aw(SQLITE_DEFAUL
ead0: 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
eae0: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49    }.  }...  /* I
eaf0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
eb00: 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
eb10: 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
eb20: 2c 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72  , free the memor
eb30: 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20  y .  ** pointed 
eb40: 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e  to by zFullPathn
eb50: 61 6d 65 2c 20 66 72 65 65 20 74 68 65 20 50 61  ame, free the Pa
eb60: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
eb70: 64 20 63 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a  d close the .  *
eb80: 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 74 68  * file. Since th
eb90: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61  e pager is not a
eba0: 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69  llocated there i
ebb0: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74  s no need to set
ebc0: 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72   .  ** any Pager
ebd0: 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  .errMask variabl
ebe0: 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
ebf0: 70 50 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c  pPager || !zFull
ec00: 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61  Pathname || !pPa
ec10: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c  ger->pTmpSpace |
ec20: 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
ec30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
ec40: 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20  Close(&fd);.    
ec50: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
ec60: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Pathname);.    s
ec70: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
ec80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28  );.    return ((
ec90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53  rc==SQLITE_OK)?S
eca0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b  QLITE_NOMEM:rc);
ecb0: 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 33 28 22  .  }..  TRACE3("
ecc0: 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
ecd0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c  ILEHANDLEID(fd),
ece0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
ecf0: 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
ed00: 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
ed10: 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  er, zFullPathnam
ed20: 65 29 29 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e)).  pPager->zF
ed30: 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
ed40: 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
ed50: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
ed60: 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
ed70: 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31  lename[nameLen+1
ed80: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
ed90: 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
eda0: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65  >zDirectory[name
edb0: 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79  Len+1];.  strcpy
edc0: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
edd0: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
ede0: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  e);.  strcpy(pPa
edf0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
ee00: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
ee10: 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65  ..  for(i=nameLe
ee20: 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72  n; i>0 && pPager
ee30: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
ee40: 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20  ]!='/'; i--){}. 
ee50: 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65   if( i>0 ) pPage
ee60: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
ee70: 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79  1] = 0;.  strcpy
ee80: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
ee90: 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  l, zFullPathname
eea0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
eeb0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
eec0: 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72    strcpy(&pPager
eed0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c  ->zJournal[nameL
eee0: 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29  en], "-journal")
eef0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
ef00: 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72   fd;.  /* pPager
ef10: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
ef20: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
ef30: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
ef40: 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44  Journal && !memD
ef50: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  b;.  pPager->noR
ef60: 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64  eadlock = noRead
ef70: 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
ef80: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
ef90: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
efa0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
efb0: 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
efc0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
efd0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
efe0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44  r->dbSize = memD
eff0: 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  b-1;.  pPager->p
f000: 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  ageSize = SQLITE
f010: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
f020: 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ZE;.  /* pPager-
f030: 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
f040: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
f050: 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
f060: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
f070: 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  age = 0; */.  /*
f080: 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67   pPager->nMaxPag
f090: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
f0a0: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30  er->mxPage = 100
f0b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
f0c0: 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20  R_UNLOCK==0 );. 
f0d0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
f0e0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
f0f0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f100: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
f110: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
f120: 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
f130: 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
f140: 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67   = memDb;.  pPag
f150: 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72  er->readOnly = r
f160: 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
f170: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
f180: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
f190: 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
f1a0: 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75  ->tempFile || !u
f1b0: 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
f1c0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
f1d0: 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f  (pPager->noSync?
f1e0: 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  0:1);.  /* pPage
f1f0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
f200: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
f210: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
f220: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f230: 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
f240: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
f250: 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  = FORCE_ALIGNMEN
f260: 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61  T(nExtra);.  pPa
f270: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
f280: 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  = PAGER_SECTOR_S
f290: 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  IZE;.  /* pPager
f2a0: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
f2b0: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73   0; */.  /* mems
f2c0: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
f2d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
f2e0: 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
f2f0: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
f300: 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ger;.#ifdef SQLI
f310: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
f320: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50  _MANAGEMENT.  pP
f330: 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ager->pNext = pT
f340: 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54  sd->pPager;.  pT
f350: 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  sd->pPager = pPa
f360: 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ger;.#endif.  re
f370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f380: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
f390: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
f3a0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
f3b0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
f3c0: 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67  _busyhandler(Pag
f3d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79  er *pPager, Busy
f3e0: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
f3f0: 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72  ndler){.  pPager
f400: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
f410: 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d   pBusyHandler;.}
f420: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
f430: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
f440: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
f450: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
f460: 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
f470: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
f480: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
f490: 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
f4a0: 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
f4b0: 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
f4c0: 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
f4d0: 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
f4e0: 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
f4f0: 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
f500: 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
f510: 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
f520: 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
f530: 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
f540: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e  e3pager_close().
f550: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
f560: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
f570: 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67 65  d by sqlite3page
f580: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  r_unref()..*/.vo
f590: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
f5a0: 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50  set_destructor(P
f5b0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
f5c0: 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64  id (*xDesc)(void
f5d0: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
f5e0: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
f5f0: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
f600: 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
f610: 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
f620: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
f630: 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
f640: 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
f650: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
f660: 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
f670: 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
f680: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
f690: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
f6a0: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
f6b0: 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
f6c0: 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
f6d0: 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
f6e0: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
f6f0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
f700: 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
f710: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
f720: 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
f730: 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
f740: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72  lite3pager_set_r
f750: 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
f760: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
f770: 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74  einit)(void*,int
f780: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
f790: 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
f7a0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
f7b0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20  the page size.  
f7c0: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73  Return the new s
f7d0: 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73 75 67  ize.  If the sug
f7e0: 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a  gest new page.**
f7f0: 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f   size is inappro
f800: 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
f810: 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
f820: 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65   size is selecte
f830: 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65  d.** and returne
f840: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
f850: 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73  3pager_set_pages
f860: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
f870: 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  r, int pageSize)
f880: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  {.  assert( page
f890: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
f8a0: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
f8b0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
f8c0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
f8d0: 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
f8e0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
f8f0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  geSize;.    sqli
f900: 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  te3ReallocOrFree
f910: 28 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65  ((void **)&pPage
f920: 72 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 70 61  r->pTmpSpace, pa
f930: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72  geSize);.  }.  r
f940: 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61  eturn pPager->pa
f950: 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
f960: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
f970: 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
f980: 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
f990: 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
f9a0: 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
f9b0: 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
f9c0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
f9d0: 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
f9e0: 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
f9f0: 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
fa00: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
fa10: 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
fa20: 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
fa30: 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
fa40: 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
fa50: 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
fa60: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
fa70: 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
fa80: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
fa90: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
faa0: 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
fab0: 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
fac0: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
fad0: 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
fae0: 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
faf0: 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f  clear_simulated_
fb00: 69 6f 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73 71  io_error(){.  sq
fb10: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
fb20: 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64  it = 0;.}.void d
fb30: 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
fb40: 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
fb50: 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
fb60: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
fb70: 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
fb80: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
fb90: 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
fba0: 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
fbb0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
fbc0: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
fbd0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
fbe0: 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
fbf0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6c 65  lse.# define cle
fc00: 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  ar_simulated_io_
fc10: 65 72 72 6f 72 28 29 0a 23 20 64 65 66 69 6e 65  error().# define
fc20: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
fc30: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
fc40: 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
fc50: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
fc60: 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
fc70: 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
fc80: 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
fc90: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
fca0: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
fcb0: 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
fcc0: 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
fcd0: 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68  *.** No error ch
fce0: 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20  ecking is done. 
fcf0: 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72  The rational for
fd00: 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
fd10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
fd20: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76  may be called ev
fd30: 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  en if the file d
fd40: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
fd50: 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65   contain a heade
fd60: 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20  r. In .** these 
fd70: 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52  cases sqlite3OsR
fd80: 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72  ead() will retur
fd90: 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77  n an error, to w
fda0: 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74  hich the correct
fdb0: 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73   .** response is
fdc0: 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d   to zero the mem
fdd0: 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64  ory at pDest and
fde0: 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65   continue.  A re
fdf0: 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  al IO error .** 
fe00: 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20  will presumably 
fe10: 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63  recur and be pic
fe20: 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f  ked up later (To
fe30: 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  do: Think about 
fe40: 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  this)..*/.int sq
fe50: 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f  lite3pager_read_
fe60: 66 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  fileheader(Pager
fe70: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
fe80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
fe90: 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
fea0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
feb0: 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
fec0: 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42   N);.  if( MEMDB
fed0: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61 62  ==0 ){.    disab
fee0: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
fef0: 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
ff00: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
ff10: 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20  er->fd, 0);.    
ff20: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
ff30: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
ff40: 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44    IOTRACE(("DBHD
ff50: 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50  R %p 0 %d\n", pP
ff60: 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63  ager, N)).    rc
ff70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
ff80: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
ff90: 73 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28 20  st, N);.    if( 
ffa0: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
ffb0: 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
ffc0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ffd0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
ffe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fff0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
10000 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
10010 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
10020 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
10030 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
10040 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
10050 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65  PENDING_BYTE lie
10060 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69  s on the page di
10070 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
10080 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66   end of the.** f
10090 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  ile, then consid
100a0 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72  er this page par
100b0 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  t of the file to
100c0 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  o. For example, 
100d0 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59  if.** PENDING_BY
100e0 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20  TE is byte 4096 
100f0 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
10100 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74  of page 5) and t
10110 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
10120 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62  * file is 4096 b
10130 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72  ytes, 5 is retur
10140 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34  ned instead of 4
10150 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10160 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
10170 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
10180 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72    i64 n;.  int r
10190 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
101a0 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
101b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
101c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
101d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
101e0 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
101f0 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
10200 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
10210 20 7b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d   {.    if( (rc =
10220 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10230 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
10240 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  n))!=SQLITE_OK )
10250 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
10260 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
10270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10280 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
10290 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
102a0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
102b0 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c    n = 1;.    }el
102c0 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70  se{.      n /= p
102d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
102e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
102f0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
10300 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
10310 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10320 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20  ze = n;.    }.  
10330 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44  }.  if( n==(PEND
10340 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
10350 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
10360 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74    n++;.  }.  ret
10370 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  urn n;.}...#ifnd
10380 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
10390 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
103a0 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
103b0 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
103c0 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
103d0 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
103e0 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  st){.  sqliteFre
103f0 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
10400 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
10410 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
10420 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
10430 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
10440 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  = 0;.}.#else.#de
10450 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72  fine clearHistor
10460 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y(x).#endif../*.
10470 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
10480 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
10490 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
104a0 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
104b0 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
104c0 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
104d0 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70  . Also set the p
104e0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20  age number to 0 
104f0 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
10500 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
10510 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20  not part of any 
10520 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73  hash chain. This
10530 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
10540 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ause the.** sqli
10550 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67  te3pager_movepag
10560 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  e() routine can 
10570 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20  leave a page in 
10580 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65  the .** pNextFre
10590 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74  e/pPrevFree list
105a0 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
105b0 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d  art of any hash-
105c0 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
105d0 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68   void unlinkHash
105e0 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Chain(Pager *pPa
105f0 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ger, PgHdr *pPg)
10600 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e  {.  if( pPg->pgn
10610 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  o==0 ){.    asse
10620 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
10630 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50  sh==0 && pPg->pP
10640 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
10650 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
10660 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
10670 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  sh ){.    pPg->p
10680 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
10690 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
106a0 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
106b0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29  pPg->pPrevHash )
106c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
106d0 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d  ager->aHash[pPg-
106e0 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  >pgno & (pPager-
106f0 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20  >nHash-1)]!=pPg 
10700 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  );.    pPg->pPre
10710 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
10720 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
10730 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
10740 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e  int h = pPg->pgn
10750 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
10760 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65  sh-1);.    pPage
10770 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
10780 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
10790 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
107a0 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72  .    clearHistor
107b0 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
107c0 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
107d0 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d   }.  pPg->pgno =
107e0 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74   0;.  pPg->pNext
107f0 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
10800 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  vHash = 0;.}../*
10810 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67  .** Unlink a pag
10820 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
10830 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f  list (the list o
10840 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72  f all pages wher
10850 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e  e nRef==0).** an
10860 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  d from its hash 
10870 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e  collision chain.
10880 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10890 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72  unlinkPage(PgHdr
108a0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
108b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
108c0 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Pager;..  /* Kee
108d0 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63  p the pFirstSync
108e0 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
108f0 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74  ing at the first
10900 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61   synchronized pa
10910 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  ge */.  if( pPg=
10920 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
10930 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
10940 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
10950 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c  xtFree;.    whil
10960 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
10970 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
10980 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70  extFree; }.    p
10990 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
109a0 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  ced = p;.  }..  
109b0 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
109c0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
109d0 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
109e0 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
109f0 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
10a00 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
10a10 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tFree;.  }else{.
10a20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10a30 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20  er->pFirst==pPg 
10a40 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
10a50 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
10a60 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66  xtFree;.  }.  if
10a70 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
10a80 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
10a90 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
10aa0 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
10ab0 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
10ac0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10ad0 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20  >pLast==pPg );. 
10ae0 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
10af0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
10b00 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  e;.  }.  pPg->pN
10b10 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
10b20 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20  PrevFree = 0;.. 
10b30 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
10b40 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
10b50 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ble */.  unlinkH
10b60 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
10b70 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pPg);.}..#ifnde
10b80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
10b90 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69  MORYDB./*.** Thi
10ba0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
10bb0 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e  d to truncate an
10bc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
10bd0 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20  ase.  Delete.** 
10be0 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20  all pages whose 
10bf0 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74  pgno is larger t
10c00 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
10c10 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65  ze and is unrefe
10c20 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72  renced..** Refer
10c30 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
10c40 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
10c50 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
10c60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
10c70 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  d memoryTruncate
10c80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
10c90 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
10ca0 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
10cb0 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
10cc0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
10cd0 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
10ce0 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
10cf0 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
10d00 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
10d10 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
10d20 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
10d30 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
10d40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
10d50 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
10d60 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
10d70 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
10d80 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
10d90 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
10da0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
10db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10dc0 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
10dd0 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c  xtAll;.      unl
10de0 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
10df0 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
10e00 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
10e10 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
10e20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
10e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
10e40 6c 73 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f  lse.#define memo
10e50 72 79 54 72 75 6e 63 61 74 65 28 70 29 0a 23 65  ryTruncate(p).#e
10e60 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ndif../*.** Try 
10e70 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
10e80 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76   on a file.  Inv
10e90 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
10ea0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
10eb0 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  k.** is currentl
10ec0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
10ed0 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74    Repeat until t
10ee0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
10ef0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73   returns.** fals
10f00 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c  e or until the l
10f10 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
10f20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
10f30 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
10f40 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
10f50 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
10f60 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
10f70 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
10f80 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
10f90 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
10fa0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
10fb0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
10fc0 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61  * The OS lock va
10fd0 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
10fe0 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67   same as the Pag
10ff0 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a  er lock values *
11000 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  /.  assert( PAGE
11010 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
11020 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
11030 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
11040 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
11050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
11060 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
11070 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
11080 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
11090 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
110a0 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68  unlocked then th
110b0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75  e size must be u
110c0 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65  nknown */.  asse
110d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
110e0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
110f0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
11100 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  e<0 || MEMDB );.
11110 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
11120 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
11130 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
11140 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
11150 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
11160 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
11170 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
11180 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
11190 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
111a0 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e  USY && sqlite3In
111b0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
111c0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
111d0 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  dler) );.    if(
111e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
111f0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
11200 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
11210 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
11220 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
11230 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70   pPager, locktyp
11240 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e)).    }.  }.  
11250 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11260 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
11270 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
11280 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
11290 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
112a0 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
112b0 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
112c0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
112d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
112e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
112f0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
11300 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73   || MEMDB );.  s
11310 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
11320 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
11330 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
11340 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
11350 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11360 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
11370 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
11380 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  >=(unsigned)pPag
11390 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
113a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
113b0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  OK;.  }.  if( ME
113c0 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
113d0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
113e0 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
113f0 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
11400 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11410 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
11420 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
11430 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
11440 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11450 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
11460 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c    /* Get an excl
11470 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
11480 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
11490 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f  e truncating. */
114a0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
114b0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
114c0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
114d0 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
114e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
114f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
11500 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
11510 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61  cate(pPager, nPa
11520 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
11530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11540 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
11550 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65   nPage;.  }.  re
11560 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11570 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
11580 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
11590 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
115a0 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
115b0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
115c0 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
115d0 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
115e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
115f0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
11600 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
11610 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
11620 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
11630 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
11640 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
11650 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
11660 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
11670 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
11680 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
11690 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
116a0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
116b0 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
116c0 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
116d0 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
116e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
116f0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
11700 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
11710 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
11720 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
11730 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
11740 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
11750 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
11760 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
11770 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
11780 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
11790 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
117a0 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
117b0 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
117c0 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
117d0 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
117e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
117f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11800 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
11810 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61  GEMENT.  /* A ma
11820 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61  lloc() cannot fa
11830 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72  il in sqlite3Thr
11840 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65  eadData() as one
11850 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74   or more calls t
11860 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29  o .  ** malloc()
11870 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
11880 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20  dy been made by 
11890 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f  this thread befo
118a0 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20  re it gets.  ** 
118b0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54  to this point. T
118c0 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68  his means the Th
118d0 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61  readData must ha
118e0 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ve been allocate
118f0 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73  d already.  ** s
11900 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  o that ThreadDat
11910 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20  a.nAlloc can be 
11920 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65  set..  */.  Thre
11930 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73  adData *pTsd = s
11940 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
11950 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ();.  assert( pP
11960 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
11970 28 20 70 54 73 64 20 26 26 20 70 54 73 64 2d 3e  ( pTsd && pTsd->
11980 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69 66  nAlloc );.#endif
11990 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
119a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
119b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
119c0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Code = 0;.  page
119d0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
119e0 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
119f0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
11a00 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53 45  .  TRACE2("CLOSE
11a10 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
11a20 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
11a30 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
11a40 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73  ", pPager)).  as
11a50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
11a60 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
11a70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
11a80 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   && pPager->stmt
11a90 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  Open==0) );.  if
11aa0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
11ab0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
11ac0 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
11ad0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20  ger->jfd);.  }. 
11ae0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
11af0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
11b00 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
11b10 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  tmtOpen ){.    s
11b20 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
11b30 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
11b40 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  }.  sqlite3OsClo
11b50 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  se(&pPager->fd);
11b60 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
11b70 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
11b80 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
11b90 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
11ba0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
11bb0 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
11bc0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
11bd0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
11be0 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66  * }.  */..#ifdef
11bf0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
11c00 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
11c10 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
11c20 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20   pager from the 
11c30 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  linked list of p
11c40 61 67 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  agers starting a
11c50 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61  t .  ** ThreadDa
11c60 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d  ta.pPager if mem
11c70 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69  ory-management i
11c80 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a  s enabled..  */.
11c90 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54    if( pPager==pT
11ca0 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  sd->pPager ){.  
11cb0 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d    pTsd->pPager =
11cc0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
11cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67    }else{.    Pag
11ce0 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f  er *pTmp;.    fo
11cf0 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70  r(pTmp = pTsd->p
11d00 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65  Pager; pTmp->pNe
11d10 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70  xt!=pPager; pTmp
11d20 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  =pTmp->pNext){}.
11d30 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20      pTmp->pNext 
11d40 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
11d50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
11d60 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
11d70 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74  >aHash);.  sqlit
11d80 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
11d90 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69  mpSpace);.  sqli
11da0 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
11db0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11dc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
11dd0 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
11de0 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
11df0 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
11e00 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65  Pgno sqlite3page
11e10 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69  r_pagenumber(voi
11e20 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
11e30 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f  dr *p = DATA_TO_
11e40 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
11e50 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
11e60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
11e70 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
11e80 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
11e90 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
11ea0 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
11eb0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
11ec0 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
11ed0 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
11ee0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
11ef0 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
11f00 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
11f10 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
11f20 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
11f30 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
11f40 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
11f50 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
11f60 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
11f70 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
11f80 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
11f90 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
11fa0 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
11fb0 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
11fc0 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
11fd0 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
11fe0 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
11ff0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
12000 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
12010 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
12020 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
12030 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
12040 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
12050 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
12060 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
12070 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
12080 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
12090 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
120a0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
120b0 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
120c0 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
120d0 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
120e0 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
120f0 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
12100 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
12110 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
12120 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
12130 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
12140 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
12150 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
12160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12170 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
12180 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
12190 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
121a0 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
121b0 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
121c0 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
121d0 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
121e0 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
121f0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
12200 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
12210 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
12220 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
12230 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
12240 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
12250 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
12260 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
12270 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
12280 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
12290 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
122a0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
122b0 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
122c0 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
122d0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
122e0 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
122f0 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
12300 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
12310 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
12320 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
12330 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
12340 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
12350 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
12360 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
12370 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
12380 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
12390 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
123a0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
123b0 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
123c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
123d0 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  r_ref(void *pDat
123e0 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
123f0 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
12400 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f  (pData);.  page_
12410 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
12420 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12430 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
12440 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
12450 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
12460 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
12470 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
12480 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
12490 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
124a0 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
124b0 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
124c0 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
124d0 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
124e0 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
124f0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
12500 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
12510 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
12520 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
12530 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
12540 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
12550 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
12560 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
12570 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
12580 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
12590 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
125a0 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
125b0 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
125c0 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
125d0 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
125e0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
125f0 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
12600 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
12610 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
12620 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
12630 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
12640 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
12650 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
12660 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
12670 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
12680 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
12690 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
126a0 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
126b0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
126c0 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
126d0 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
126e0 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
126f0 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
12700 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
12710 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
12720 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
12730 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
12740 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
12750 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
12760 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
12770 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
12780 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
12790 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
127a0 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
127b0 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20  ailure, so sync 
127c0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
127d0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
127e0 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  s the needSync f
127f0 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61  ield of every pa
12800 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20  ge current held 
12810 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  in.** memory..*/
12820 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
12830 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
12840 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
12850 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
12860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
12870 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
12880 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
12890 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
128a0 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
128b0 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
128c0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
128d0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
128e0 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
128f0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
12900 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
12910 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
12920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12930 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
12940 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73  n );.      /* as
12950 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e  sert( !pPager->n
12960 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79  oSync ); // noSy
12970 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20  nc might be set 
12980 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  if synchronous. 
12990 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e       ** was turn
129a0 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65  ed off after the
129b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
129c0 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65   started.  Ticke
129d0 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65  t #615 */.#ifnde
129e0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b  f NDEBUG.      {
129f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
12a00 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72   sure the pPager
12a10 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77  ->nRec counter w
12a20 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67  e are keeping ag
12a30 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  rees.        ** 
12a40 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f  with the nRec co
12a50 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
12a60 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
12a70 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
12a80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
12a90 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63   jSz;.        rc
12aa0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
12ab0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
12ac0 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20  , &jSz);.       
12ad0 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
12ae0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
12af0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12b00 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20  journalOff==jSz 
12b10 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
12b20 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
12b30 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
12b40 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
12b50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12b60 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
12b70 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
12b80 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
12b90 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
12ba0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
12bb0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
12bc0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
12bd0 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
12be0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
12bf0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
12c00 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
12c10 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
12c20 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20  e for rollback. 
12c30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
12c40 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
12c50 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
12c60 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59        TRACE2("SY
12c70 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
12c80 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
12c90 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
12ca0 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
12cb0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
12cc0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
12cd0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
12ce0 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
12cf0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
12d00 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
12d10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12d20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12d30 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
12d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
12d60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
12d70 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
12d80 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
12d90 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12da0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 49 4f  n rc;.        IO
12db0 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
12dc0 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
12dd0 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  er,.            
12de0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
12df0 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
12e00 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
12e10 2c 20 34 29 29 0a 20 20 20 20 20 20 20 20 72 63  , 4)).        rc
12e20 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
12e30 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
12e40 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
12e50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
12e60 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20  rn rc;..        
12e70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
12e80 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
12e90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12ea0 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ff);.        if(
12eb0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
12ec0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
12ed0 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
12ee0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
12ef0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
12f00 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
12f10 4a 53 59 4e 43 20 25 64 5c 6e 22 2c 20 70 50 61  JSYNC %d\n", pPa
12f20 67 65 72 29 29 0a 20 20 20 20 20 20 72 63 20 3d  ger)).      rc =
12f30 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
12f40 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
12f50 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
12f60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
12f70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12f80 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
12f90 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
12fa0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
12fb0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
12fc0 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
12fd0 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
12fe0 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
12ff0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
13000 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
13010 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
13020 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
13030 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
13040 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
13050 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
13060 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
13070 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rst;.  }..#ifnde
13080 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
13090 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
130a0 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
130b0 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
130c0 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
130d0 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
130e0 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
130f0 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
13100 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
13110 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
13120 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
13130 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
13140 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
13150 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
13160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13170 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
13180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
13190 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
131a0 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
131b0 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  ->pFirst );.  }.
131c0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
131d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
131e0 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66  rge two lists of
131f0 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
13200 20 62 79 20 70 44 69 72 74 79 20 61 6e 64 20 69   by pDirty and i
13210 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a  n pgno order..**
13220 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78   Do not both fix
13230 69 6e 67 20 74 68 65 20 70 50 72 65 76 44 69 72  ing the pPrevDir
13240 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  ty pointers..*/.
13250 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65  static PgHdr *me
13260 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  rge_pagelist(PgH
13270 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70  dr *pA, PgHdr *p
13280 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75  B){.  PgHdr resu
13290 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54  lt, *pTail;.  pT
132a0 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20  ail = &result;. 
132b0 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70 42   while( pA && pB
132c0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
132d0 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b  pgno<pB->pgno ){
132e0 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  .      pTail->pD
132f0 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20  irty = pA;.     
13300 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20   pTail = pA;.   
13310 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72     pA = pA->pDir
13320 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
13330 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
13340 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  ty = pB;.      p
13350 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20  Tail = pB;.     
13360 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79   pB = pB->pDirty
13370 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13380 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pA ){.    pTai
13390 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
133a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29    }else if( pB )
133b0 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
133c0 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73  rty = pB;.  }els
133d0 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  e{.    pTail->pD
133e0 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
133f0 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44  return result.pD
13400 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  irty;.}../*.** S
13410 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ort the list of 
13420 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
13430 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f  ng order by pgno
13440 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20  .  Pages are.** 
13450 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
13460 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54  rty pointers.  T
13470 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
13480 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f  inters are.** co
13490 72 72 75 70 74 65 64 20 62 79 20 74 68 69 73 20  rrupted by this 
134a0 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  sort..*/.#define
134b0 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 32   N_SORT_BUCKET 2
134c0 35 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  5.static PgHdr *
134d0 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67  sort_pagelist(Pg
134e0 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48  Hdr *pIn){.  PgH
134f0 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43  dr *a[N_SORT_BUC
13500 4b 45 54 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20  KET], *p;.  int 
13510 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30  i;.  memset(a, 0
13520 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20  , sizeof(a));.  
13530 77 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20  while( pIn ){.  
13540 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70    p = pIn;.    p
13550 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  In = p->pDirty;.
13560 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
13570 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
13580 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d  i<N_SORT_BUCKET-
13590 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
135a0 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  f( a[i]==0 ){.  
135b0 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a        a[i] = p;.
135c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
135d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
135e0 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61      p = merge_pa
135f0 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b  gelist(a[i], p);
13600 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
13610 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
13620 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f  .    if( i==N_SO
13630 52 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20  RT_BUCKET-1 ){. 
13640 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67       a[i] = merg
13650 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
13660 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   p);.    }.  }. 
13670 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72   p = a[0];.  for
13680 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42  (i=1; i<N_SORT_B
13690 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20  UCKET; i++){.   
136a0 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c   p = merge_pagel
136b0 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20  ist(p, a[i]);.  
136c0 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
136d0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c  ./*.** Given a l
136e0 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f  ist of pages (co
136f0 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50  nnected by the P
13700 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
13710 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76  ter) write.** ev
13720 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ery one of those
13730 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68   pages out to th
13740 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13750 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c  and mark them al
13760 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a  l.** as clean..*
13770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13780 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
13790 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  t(PgHdr *pList){
137a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
137b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
137c0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
137d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
137e0 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
137f0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
13800 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
13810 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
13820 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
13830 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
13840 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
13850 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
13860 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
13870 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
13880 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
13890 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
138a0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65  ite3OsLock() are
138b0 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20   no-ops..  **.  
138c0 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
138d0 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
138e0 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
138f0 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
13900 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
13910 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
13920 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
13930 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
13940 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
13950 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
13960 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
13970 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
13980 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
13990 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
139a0 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
139b0 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
139c0 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
139d0 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
139e0 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
139f0 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
13a00 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
13a10 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
13a20 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
13a30 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
13a40 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
13a50 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
13a60 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
13a70 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
13a80 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
13a90 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
13aa0 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
13ab0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
13ac0 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
13ad0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
13ae0 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
13af0 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
13b00 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
13b10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13b20 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
13b30 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
13b40 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
13b50 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
13b60 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
13b70 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
13b80 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
13b90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
13ba0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13bb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
13bc0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c  rn rc;.  }..  pL
13bd0 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c  ist = sort_pagel
13be0 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 77 68  ist(pList);.  wh
13bf0 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20  ile( pList ){.  
13c00 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
13c10 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 72 63  >dirty );.    rc
13c20 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
13c30 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c  (pPager->fd, (pL
13c40 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36  ist->pgno-1)*(i6
13c50 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
13c60 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ze);.    if( rc 
13c70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13c80 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
13c90 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
13ca0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
13cb0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
13cc0 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
13cd0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
13ce0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
13cf0 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63  lite3pager_trunc
13d00 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ate() was called
13d10 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
13d20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
13d30 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
13d40 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
13d50 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
13d60 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
13d70 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
13d80 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
13d90 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70  ( pList->pgno<=p
13da0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
13db0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
13dc0 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  ta = CODEC2(pPag
13dd0 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
13de0 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
13df0 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20  >pgno, 6);.     
13e00 20 54 52 41 43 45 33 28 22 53 54 4f 52 45 20 25   TRACE3("STORE %
13e10 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
13e20 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
13e30 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
13e40 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
13e50 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
13e60 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
13e70 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  )).      rc = sq
13e80 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
13e90 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
13ea0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
13eb0 29 3b 0a 20 20 20 20 20 20 54 45 53 54 5f 49 4e  );.      TEST_IN
13ec0 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
13ed0 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  e);.    }.#ifnde
13ee0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73  f NDEBUG.    els
13ef0 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  e{.      TRACE3(
13f00 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
13f10 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
13f20 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
13f30 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
13f40 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
13f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13f60 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30  pList->dirty = 0
13f70 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13f80 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
13f90 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
13fa0 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
13fb0 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
13fc0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
13fd0 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
13fe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13ff0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
14000 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
14010 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
14020 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
14030 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
14040 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
14050 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
14060 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
14070 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
14080 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
14090 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
140a0 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
140b0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
140c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
140d0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
140e0 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
140f0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
14100 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
14110 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
14120 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
14130 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
14140 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
14150 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
14160 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
14170 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
14180 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14190 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
141a0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
141b0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
141c0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
141d0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
141e0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
141f0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
14200 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
14210 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
14220 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
14230 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
14240 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14250 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75    if( !pPager->u
14260 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75  seJournal ) retu
14270 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
14280 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
14290 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
142a0 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  l) ) return 0;. 
142b0 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68   if( sqlite3OsCh
142c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
142d0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65  pPager->fd) ) re
142e0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
142f0 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
14300 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20  ount(pPager)==0 
14310 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
14320 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
14330 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65  Journal);.    re
14340 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
14350 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
14360 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20   }.}../*.** Try 
14370 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
14380 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
14390 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64   can be recycled
143a0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  . .**.** This ro
143b0 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e  utine may return
143c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
143d0 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51  QLITE_FULL or SQ
143e0 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20  LITE_OK. It .** 
143f0 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65  does not set the
14400 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
14410 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74   variable..*/.st
14420 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72  atic int pager_r
14430 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50  ecycle(Pager *pP
14440 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b  ager, int syncOk
14450 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b  , PgHdr **ppPg){
14460 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
14470 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f   *ppPg = 0;..  /
14480 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f  * Find a page to
14490 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74   recycle.  Try t
144a0 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  o locate a page 
144b0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  that does not.  
144c0 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f  ** require us to
144d0 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f   do an fsync() o
144e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20  n the journal.. 
144f0 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67   */.  pPg = pPag
14500 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
14510 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  ;..  /* If we co
14520 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70  uld not find a p
14530 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
14540 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79  t require an fsy
14550 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  nc().  ** on the
14560 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
14570 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75  en fsync the jou
14580 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73  rnal file.  This
14590 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20   is a.  ** very 
145a0 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20  slow operation, 
145b0 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20  so we work hard 
145c0 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75  to avoid it.  Bu
145d0 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a  t sometimes.  **
145e0 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c   it can't be hel
145f0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
14600 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72  pPg==0 && pPager
14610 2d 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e 63  ->pFirst && sync
14620 4f 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20  Ok && !MEMDB){. 
14630 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63     int rc = sync
14640 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
14650 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
14660 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
14670 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
14680 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
14690 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
146a0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
146b0 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20  de, write a new 
146c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
146d0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  nto the.      **
146e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
146f0 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61  his is done to a
14700 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79  void ever modify
14710 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  ing a journal.  
14720 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68      ** header th
14730 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  at is involved i
14740 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f  n the rollback o
14750 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
14760 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  e.      ** alrea
14770 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
14780 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14790 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61  (in case the hea
147a0 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  der is.      ** 
147b0 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65  trashed when the
147c0 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
147d0 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a  pdated)..      *
147e0 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
147f0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
14800 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
14810 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29  journalOff > 0 )
14820 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
14830 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
14840 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
14850 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
14860 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14870 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
14880 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
14890 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  st;.  }.  if( pP
148a0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
148b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
148c0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  }..  assert( pPg
148d0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
148e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
148f0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
14900 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  e file if it is 
14910 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  dirty..  */.  if
14920 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
14930 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
14940 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
14950 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
14960 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
14970 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
14980 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
14990 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
149a0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
149b0 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
149c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
149d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
149e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
149f0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
14a00 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
14a10 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
14a20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
14a30 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
14a40 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
14a50 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  en.  ** set the 
14a60 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
14a70 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
14a80 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
14a90 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f   ** sqlite_dont_
14aa0 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  rollback() optim
14ab0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
14ac0 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
14ad0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
14ae0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
14af0 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
14b00 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
14b10 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
14b20 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72  .  ** might be r
14b30 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
14b40 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
14b50 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
14b60 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  't remember.  **
14b70 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
14b80 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
14b90 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
14ba0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
14bb0 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b  ust.  ** be mark
14bc0 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
14bd0 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
14be0 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  n out..  */.  if
14bf0 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
14c00 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54  lback ){.    IOT
14c10 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f  RACE(("ALWAYS_RO
14c20 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50  LLBACK %p\n", pP
14c30 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65  ager)).    pPage
14c40 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
14c50 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 1;.  }..  /*
14c60 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
14c70 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
14c80 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
14c90 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  hash table.  */.
14ca0 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
14cb0 29 3b 0a 20 20 54 45 53 54 5f 49 4e 43 52 28 70  );.  TEST_INCR(p
14cc0 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 0a  Pager->nOvfl);..
14cd0 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20    *ppPg = pPg;. 
14ce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14cf0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
14d00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
14d10 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65  led to free supe
14d20 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61  rfluous dynamica
14d30 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  lly allocated me
14d40 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20  mory.** held by 
14d50 74 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d  the pager system
14d60 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  . Memory in use 
14d70 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61  by any SQLite pa
14d80 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ger allocated.**
14d90 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
14da0 74 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71  thread may be sq
14db0 6c 69 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a  liteFree()ed..**
14dc0 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20  .** nReq is the 
14dd0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
14de0 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  of memory requir
14df0 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75  ed. Once this mu
14e00 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72  ch has.** been r
14e10 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e  eleased, the fun
14e20 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41  ction returns. A
14e30 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
14e40 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a  for nReq means.*
14e50 2a 20 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d  * free as much m
14e60 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
14e70 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  e. The return va
14e80 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c  lue is the total
14e90 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62   number .** of b
14ea0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
14eb0 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  eleased..*/.#ifd
14ec0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14ed0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
14ee0 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  NT.int sqlite3pa
14ef0 67 65 72 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  ger_release_memo
14f00 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20  ry(int nReq){.  
14f10 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61  const ThreadData
14f20 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c 69 74   *pTsdro = sqlit
14f30 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
14f40 4f 6e 6c 79 28 29 3b 0a 20 20 50 61 67 65 72 20  Only();.  Pager 
14f50 2a 70 3b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61  *p;.  int nRelea
14f60 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  sed = 0;.  int i
14f70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  ;..  /* If the t
14f80 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
14f90 69 73 20 68 65 6c 64 2c 20 74 68 69 73 20 73 75  is held, this su
14fa0 62 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73  broutine becomes
14fb0 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65   a.  ** o-op; ze
14fc0 72 6f 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  ro bytes of memo
14fd0 72 79 20 61 72 65 20 66 72 65 65 64 2e 20 20 54  ry are freed.  T
14fe0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 0a 20  his is because. 
14ff0 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20   ** some of the 
15000 63 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62 79 20  code invoked by 
15010 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
15020 79 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20  y also.  ** try 
15030 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75  to obtain the mu
15040 74 65 78 2c 20 72 65 73 75 6c 74 69 6e 67 20 69  tex, resulting i
15050 6e 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20  n a deadlock..  
15060 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
15070 4f 73 49 6e 4d 75 74 65 78 28 30 29 20 29 7b 0a  OsInMutex(0) ){.
15080 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15090 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73  }..  /* Outermos
150a0 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20  t loop runs for 
150b0 61 74 20 6d 6f 73 74 20 74 77 6f 20 69 74 65 72  at most two iter
150c0 61 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 69 74  ations. First it
150d0 65 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20  eration we.  ** 
150e0 74 72 79 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f  try to find memo
150f0 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  ry that can be r
15100 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 20  eleased without 
15110 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e  calling fsync().
15120 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65   Second.  ** ite
15130 72 61 74 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e  ration (which on
15140 6c 79 20 72 75 6e 73 20 69 66 20 74 68 65 20 66  ly runs if the f
15150 69 72 73 74 20 66 61 69 6c 65 64 20 74 6f 20 66  irst failed to f
15160 72 65 65 20 6e 52 65 71 20 62 79 74 65 73 20 6f  ree nReq bytes o
15170 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69  f.  ** memory) i
15180 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 63  s permitted to c
15190 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54 68 69  all fsync(). Thi
151a0 73 20 69 73 20 6f 66 20 63 6f 75 72 73 65 20 6d  s is of course m
151b0 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65  uch more .  ** e
151c0 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20  xpensive..  */. 
151d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31 3b 20   for(i=0; i<=1; 
151e0 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  i++){..    /* Lo
151f0 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74  op through all t
15200 68 65 20 53 51 4c 69 74 65 20 70 61 67 65 72 73  he SQLite pagers
15210 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 63   opened by the c
15220 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 2a  urrent thread. *
15230 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 54 73 64  /.    for(p=pTsd
15240 72 6f 2d 3e 70 50 61 67 65 72 3b 20 70 20 26 26  ro->pPager; p &&
15250 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c   (nReq<0 || nRel
15260 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 3d 70  eased<nReq); p=p
15270 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
15280 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
15290 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20    int rc;..     
152a0 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61 67   /* For each pag
152b0 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65 20  er, try to free 
152c0 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61 73  as many pages as
152d0 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68 6f   possible (witho
152e0 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ut .      ** cal
152f0 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66 20  ling fsync() if 
15300 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
15310 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
15320 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20 20  he outermost .  
15330 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20      ** loop)..  
15340 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68 69      */.      whi
15350 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  le( SQLITE_OK==(
15360 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
15370 6c 65 28 70 2c 20 69 2c 20 26 70 50 67 29 29 20  le(p, i, &pPg)) 
15380 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20  && pPg) {.      
15390 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64    /* We've found
153a0 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e   a page to free.
153b0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
153c0 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
153d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d   .        ** rem
153e0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  oved from the pa
153f0 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66  ge hash-table, f
15400 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e  ree-list and syn
15410 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20  ced-list .      
15420 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63    ** (pFirstSync
15430 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c  ed). It is still
15440 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65   in the all page
15450 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a  s (pAll) list. .
15460 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76          ** Remov
15470 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c  e it from this l
15480 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69  ist before freei
15490 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng..        **. 
154a0 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20         ** Todo: 
154b0 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e  Check the Pager.
154c0 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61  pStmt list to ma
154d0 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20  ke sure this is 
154e0 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20  Ok. It .        
154f0 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74  ** probably is t
15500 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a  hough..        *
15510 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  /.        PgHdr 
15520 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  *pTmp;.        a
15530 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20  ssert( pPg );.  
15540 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76        page_remov
15550 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
15560 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69  (pPg);.        i
15570 66 28 20 70 50 67 3d 3d 70 2d 3e 70 41 6c 6c 20  f( pPg==p->pAll 
15580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ){.           p-
15590 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65  >pAll = pPg->pNe
155a0 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  xtAll;.        }
155b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
155c0 66 6f 72 28 20 70 54 6d 70 3d 70 2d 3e 70 41 6c  for( pTmp=p->pAl
155d0 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  l; pTmp->pNextAl
155e0 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d  l!=pPg; pTmp=pTm
155f0 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a  p->pNextAll ){}.
15600 20 20 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e            pTmp->
15610 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e  pNextAll = pPg->
15620 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
15630 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 52 65 6c    }.        nRel
15640 65 61 73 65 64 20 2b 3d 20 73 71 6c 69 74 65 41  eased += sqliteA
15650 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b 0a 20  llocSize(pPg);. 
15660 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
15670 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
15680 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
15690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
156a0 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
156b0 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77  occured whilst w
156c0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
156d0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a  tabase file or .
156e0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
156f0 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79  al in pager_recy
15700 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72  cle(). The error
15710 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64   is not returned
15720 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20   to the .       
15730 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68   ** caller of th
15740 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73  is function. Ins
15750 74 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61  tead, set the Pa
15760 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69  ger.errCode vari
15770 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  able..        **
15780 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
15790 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  be returned to t
157a0 68 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72  he user (or user
157b0 73 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a  s, in the case .
157c0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
157d0 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61 63  shared pager cac
157e0 68 65 29 20 6f 66 20 74 68 65 20 70 61 67 65 72  he) of the pager
157f0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 65   for which the e
15800 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20  rror occured..  
15810 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15820 20 61 73 73 65 72 74 28 20 28 72 63 26 30 78 66   assert( (rc&0xf
15830 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
15840 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46   || rc==SQLITE_F
15850 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ULL );.        a
15860 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e  ssert( p->state>
15870 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
15880 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  );.        pager
15890 5f 65 72 72 6f 72 28 70 2c 20 72 63 29 3b 0a 20  _error(p, rc);. 
158a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
158b0 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65  ..  return nRele
158c0 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ased;.}.#endif /
158d0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
158e0 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
158f0 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  T */../*.** Acqu
15900 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ire a page..**.*
15910 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  * A read lock on
15920 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
15930 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20  s obtained when 
15940 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
15950 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20  s acquired. .** 
15960 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69  This read lock i
15970 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74  s dropped when t
15980 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  he last page is 
15990 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
159a0 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72  A _get works for
159b0 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
159c0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
159d0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
159e0 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
159f0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
15a00 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
15a10 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
15a20 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
15a30 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
15a40 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
15a50 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
15a60 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
15a70 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
15a80 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
15a90 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
15aa0 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
15ab0 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
15ac0 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
15ad0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
15ae0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
15af0 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
15b00 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
15b10 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
15b20 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
15b30 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
15b40 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
15b50 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
15b60 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
15b70 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
15b80 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
15b90 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
15ba0 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b  outine and _look
15bb0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
15bc0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
15bd0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
15be0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
15bf0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
15c00 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
15c10 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
15c20 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
15c30 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
15c40 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29  hereas _lookup()
15c50 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
15c60 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
15c70 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
15c80 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
15c90 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
15ca0 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
15cb0 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
15cc0 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
15cd0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
15ce0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f  ry..** Since _lo
15cf0 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
15d00 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
15d10 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
15d20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
15d30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
15d40 2a 2a 0a 2a 2a 20 49 66 20 63 6c 72 46 6c 61 67  **.** If clrFlag
15d50 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70   is false, the p
15d60 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
15d70 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
15d80 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20  rom disk..** If 
15d90 63 6c 66 46 6c 61 67 20 69 73 20 74 72 75 65 2c  clfFlag is true,
15da0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 70 61   it means the pa
15db0 67 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  ge is about to b
15dc0 65 20 65 72 61 73 65 64 20 61 6e 64 0a 2a 2a 20  e erased and.** 
15dd0 72 65 77 72 69 74 74 65 6e 20 77 69 74 68 6f 75  rewritten withou
15de0 74 20 66 69 72 73 74 20 62 65 69 6e 67 20 72 65  t first being re
15df0 61 64 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  ad so there is n
15e00 6f 20 70 6f 69 6e 74 20 69 74 20 64 6f 69 6e 67  o point it doing
15e10 0a 2a 2a 20 74 68 65 20 64 69 73 6b 20 49 2f 4f  .** the disk I/O
15e20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15e30 70 61 67 65 72 5f 61 63 71 75 69 72 65 28 50 61  pager_acquire(Pa
15e40 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
15e50 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70  o pgno, void **p
15e60 70 50 61 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c  pPage, int clrFl
15e70 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ag){.  PgHdr *pP
15e80 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
15e90 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
15ea0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
15eb0 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
15ec0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
15ed0 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
15ee0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
15ef0 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72  s, or zero, is r
15f00 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
15f10 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
15f20 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
15f30 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
15f40 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
15f50 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
15f60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
15f70 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
15f80 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
15f90 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
15fa0 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
15fb0 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
15fc0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70  Pager!=0 );.  *p
15fd0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  pPage = 0;.  if(
15fe0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
15ff0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
16000 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
16010 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
16020 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
16030 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69    }..  /* If thi
16040 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
16050 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
16060 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
16070 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
16080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
16090 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
160a0 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d  r->nRef==0 && !M
160b0 45 4d 44 42 20 29 7b 0a 20 20 20 20 69 66 28 20  EMDB ){.    if( 
160c0 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
160d0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ock ){.      rc 
160e0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
160f0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
16100 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
16110 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16120 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
16130 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
16140 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
16150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
16160 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
16170 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
16180 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
16190 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
161a0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
161b0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
161c0 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
161d0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
161e0 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
161f0 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48 6f  */.    if( hasHo
16200 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
16210 20 29 7b 0a 20 20 20 20 20 20 20 2f 2a 20 47 65   ){.       /* Ge
16220 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
16230 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16240 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
16250 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
16260 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
16270 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
16280 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
16290 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
162a0 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
162b0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
162c0 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
162d0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
162e0 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
162f0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
16300 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
16310 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
16320 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
16330 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  at the.       **
16340 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
16350 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
16360 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
16370 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
16380 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b   .       ** back
16390 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  ..       ** .   
163a0 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
163b0 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
163c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
163d0 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
163e0 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73 65  the.       ** se
163f0 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
16400 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
16410 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
16420 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
16430 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
16440 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
16450 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
16460 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
16470 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
16480 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
16490 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
164a0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
164b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
164c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
164d0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
164e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
164f0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
16500 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
16510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16520 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
16530 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
16540 0a 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ..       /* Open
16550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
16560 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20   reading only.  
16570 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  Return SQLITE_BU
16580 53 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20  SY if.       ** 
16590 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
165a0 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
165b0 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20  l file. .       
165c0 2a 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65  **.       ** The
165d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
165e0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
165f0 65 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e  e locked itself.
16600 20 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20    The.       ** 
16610 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
16620 6e 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73  never open unles
16630 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
16640 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20  ase file holds. 
16650 20 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65        ** a write
16660 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20   lock, so there 
16670 69 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61  is never any cha
16680 6e 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  nce of two or mo
16690 72 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  re.       ** pro
166a0 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74  cesses opening t
166b0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68  he journal at th
166c0 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20  e same time..   
166d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
166e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
166f0 52 65 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d  ReadOnly(pPager-
16700 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67  >zJournal, &pPag
16710 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
16720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16730 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 70  OK ){.         p
16740 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
16750 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 72 65  er);.         re
16760 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
16770 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ;.       }.     
16780 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
16790 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
167a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
167b0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
167c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
167d0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
167e0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
167f0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
16800 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
16810 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20  lHdr = 0;..     
16820 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
16830 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
16840 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
16850 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
16860 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
16870 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
16880 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
16890 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
168a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
168b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
168c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
168d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65  K ){.         re
168e0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
168f0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
16900 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16910 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
16920 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
16930 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63   for page in cac
16940 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  he */.    pPg = 
16950 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
16960 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
16970 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61  if( MEMDB && pPa
16980 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
16990 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
169a0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
169b0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
169c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
169d0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
169e0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
169f0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
16a00 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
16a10 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
16a20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
16a30 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66  ->nMiss);.    if
16a40 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
16a50 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
16a60 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
16a70 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a  ==0 || MEMDB ){.
16a80 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
16a90 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20  a new page */.  
16aa0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16ab0 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e  nPage>=pPager->n
16ac0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Hash ){.        
16ad0 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73  pager_resize_has
16ae0 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a  h_table(pPager,.
16af0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
16b00 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32  r->nHash<256 ? 2
16b10 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61  56 : pPager->nHa
16b20 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 69  sh*2);.        i
16b30 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  f( pPager->nHash
16b40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
16b60 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
16b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
16b80 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
16b90 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67  Raw( sizeof(*pPg
16ba0 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) + pPager->page
16bb0 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bd0 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
16be0 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
16bf0 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c10 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
16c20 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
16c30 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
16c40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16c50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
16c60 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
16c70 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f  et(pPg, 0, sizeo
16c80 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20  f(*pPg));.      
16c90 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
16ca0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
16cb0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
16cc0 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
16cd0 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
16ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
16cf0 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
16d00 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  r;.      pPg->pN
16d10 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
16d20 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61  >pAll;.      pPa
16d30 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
16d40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
16d50 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
16d60 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
16d70 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
16d80 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16d90 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78  rt( pPager->nMax
16da0 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e  Page==(pPager->n
16db0 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20  Page-1) );.     
16dc0 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50     pPager->nMaxP
16dd0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  age++;.      }. 
16de0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16df0 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63  rc = pager_recyc
16e00 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  le(pPager, 1, &p
16e10 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
16e20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16e30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16e40 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
16e50 20 61 73 73 65 72 74 28 70 50 67 29 20 3b 0a 20   assert(pPg) ;. 
16e60 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67     }.    pPg->pg
16e70 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69  no = pgno;.    i
16e80 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
16e90 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
16ea0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
16eb0 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
16ec0 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
16ed0 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
16ee0 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
16ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
16f00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16f10 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
16f20 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
16f30 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
16f40 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
16f50 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
16f60 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
16f70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
16f80 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
16f90 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
16fa0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
16fb0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
16fc0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
16fd0 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  t && (int)pgno<=
16fe0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
16ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
17000 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d   (pPager->aInStm
17010 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  t[pgno/8] & (1<<
17020 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b  (pgno&7)))!=0 ){
17030 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
17040 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
17050 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17060 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f      page_remove_
17070 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70  from_stmt_list(p
17080 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  Pg);.    }.    m
17090 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
170a0 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
170b0 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
170c0 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  g);..    pPager-
170d0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28  >nRef++;.    if(
170e0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
170f0 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
17100 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
17110 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
17120 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
17130 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
17140 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17150 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17160 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
17170 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
17180 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61  ;.      rc = pPa
17190 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
171a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
171b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70     }..    /* Pop
171c0 75 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77  ulate the page w
171d0 69 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72  ith data, either
171e0 20 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   by reading from
171f0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
17200 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79    ** file, or by
17210 20 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74   setting the ent
17220 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f  ire page to zero
17230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
17240 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
17250 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3c  gecount(pPager)<
17260 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
17270 44 42 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28  DB.         || (
17280 63 6c 72 46 6c 61 67 20 26 26 20 21 70 50 61 67  clrFlag && !pPag
17290 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
172a0 63 6b 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ck) .    ){.    
172b0 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
172c0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
172d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
172e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
172f0 20 20 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44      assert( MEMD
17300 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  B==0 );.      rc
17310 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
17320 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  (pPager->fd, (pg
17330 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
17340 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17350 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
17380 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
17390 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
173a0 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  g),.            
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
173d0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
173e0 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49     IOTRACE(("PGI
173f0 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
17400 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20 20 20 20  er, pgno)).     
17410 20 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25   TRACE3("FETCH %
17420 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
17430 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
17440 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
17450 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
17460 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
17470 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  g), pPg->pgno, 3
17480 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
17490 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
174a0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
174b0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
174c0 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d       pPg->pgno =
174d0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
174e0 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50  te3pager_unref(P
174f0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
17500 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
17510 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c  rn rc;.      }el
17520 73 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54  se{.        TEST
17530 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
17540 65 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ead);.      }.  
17550 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b    }..    /* Link
17560 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
17570 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62  he page hash tab
17580 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67  le */.    h = pg
17590 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
175a0 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65  ash-1);.    asse
175b0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
175c0 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
175d0 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
175e0 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
175f0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
17600 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
17610 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
17620 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
17630 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
17640 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
17650 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
17660 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
17670 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
17680 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
17690 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
176a0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
176b0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
176c0 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
176d0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
176e0 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
176f0 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
17700 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
17710 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70  er->nHit);.    p
17720 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
17730 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47  }.  *ppPage = PG
17740 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
17750 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17760 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
17770 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
17780 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
17790 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
177a0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
177b0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
177c0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
177d0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
177e0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
177f0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
17800 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
17810 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
17820 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
17830 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
17840 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
17850 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
17860 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
17870 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
17880 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
17890 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
178a0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
178b0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
178c0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
178d0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
178e0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
178f0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
17900 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
17910 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
17920 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
17930 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  appened..*/.void
17940 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c   *sqlite3pager_l
17950 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
17960 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
17970 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
17980 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17990 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
179a0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66   pgno!=0 );.  if
179b0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
179c0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
179d0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
179e0 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
179f0 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70  0;.  }.  pPg = p
17a00 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
17a10 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
17a20 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
17a30 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
17a40 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg);.  return PG
17a50 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
17a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
17a70 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
17a80 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
17a90 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
17aa0 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
17ab0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
17ac0 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
17ad0 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
17ae0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
17af0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
17b00 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
17b10 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
17b20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
17b30 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
17b40 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
17b50 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
17b60 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69  3pager_unref(voi
17b70 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
17b80 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44  dr *pPg;..  /* D
17b90 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
17ba0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
17bb0 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
17bc0 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f    pPg = DATA_TO_
17bd0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
17be0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
17bf0 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
17c00 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
17c10 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  pPg);..  CHECK_P
17c20 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
17c30 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
17c40 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
17c50 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
17c60 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
17c70 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
17c80 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
17c90 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
17ca0 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
17cb0 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
17cc0 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
17cd0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
17ce0 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
17cf0 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
17d00 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
17d10 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
17d20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
17d30 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
17d40 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
17d50 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
17d60 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
17d70 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
17d80 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
17d90 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
17da0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
17db0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
17dc0 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
17dd0 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20  tSynced==0 ){.  
17de0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
17df0 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a  stSynced = pPg;.
17e00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
17e10 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
17e20 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
17e30 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
17e40 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17e50 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
17e60 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c   .    /* When al
17e70 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68  l pages reach th
17e80 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70  e freelist, drop
17e90 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66   the read lock f
17ea0 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  rom.    ** the d
17eb0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
17ec0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
17ed0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73  >nRef--;.    ass
17ee0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
17ef0 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  f>=0 );.    if( 
17f00 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
17f10 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  && !MEMDB ){.   
17f20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
17f30 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
17f40 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17f50 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
17f60 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
17f70 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
17f80 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
17f90 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
17fa0 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
17fb0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
17fc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
17fd0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
17fe0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
17ff0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18000 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
18010 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
18020 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
18030 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
18040 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
18050 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
18060 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18070 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
18080 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
18090 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
180a0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  t( !MEMDB );.  a
180b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
180c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
180d0 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
180e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
180f0 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  lOpen==0 );.  as
18100 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
18110 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
18120 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
18130 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
18140 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
18150 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
18160 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
18170 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
18180 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
18190 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
181a0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
181b0 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
181c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
181d0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
181e0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
181f0 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  nal;.  }.  rc = 
18200 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
18210 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a  lusive(pPager->z
18220 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
18230 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20  ->jfd,.         
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18250 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
18260 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50 61  tempFile);.  pPa
18270 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
18280 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
18290 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
182a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
182b0 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  dr = 0;.  if( rc
182c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
182d0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
182e0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
182f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
18300 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65  etFullSync(pPage
18310 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
18320 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73  full_fsync);.  s
18330 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53  qlite3OsSetFullS
18340 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
18350 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
18360 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  nc);.  sqlite3Os
18370 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50  OpenDirectory(pP
18380 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
18390 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a  r->zDirectory);.
183a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
183b0 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
183c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
183d0 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
183e0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
183f0 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
18400 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
18410 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
18420 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
18430 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
18440 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
18450 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
18460 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
18470 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
18480 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
18490 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
184a0 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
184b0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
184c0 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
184d0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
184e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
184f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18500 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  te3pager_stmt_be
18510 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
18520 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18530 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
18540 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
18550 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
18560 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
18570 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18590 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
185a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
185b0 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
185c0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
185d0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
185e0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
185f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
18600 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 69  Journal = 0;.  i
18610 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
18620 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  MEM ){.    /* If
18630 20 74 68 69 73 20 77 61 73 20 61 20 6d 61 6c 6c   this was a mall
18640 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 74 68  oc() failure, th
18650 65 6e 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 62  en we will not b
18660 65 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61  e closing the pa
18670 67 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ger.    ** file.
18680 20 53 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 6a   So delete any j
18690 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 65 20 6d  ournal file we m
186a0 61 79 20 68 61 76 65 20 6a 75 73 74 20 63 72 65  ay have just cre
186b0 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  ated. Otherwise,
186c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 79 73 74  .    ** the syst
186d0 65 6d 20 77 69 6c 6c 20 67 65 74 20 63 6f 6e 66  em will get conf
186e0 75 73 65 64 2c 20 77 65 20 68 61 76 65 20 61 20  used, we have a 
186f0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
18700 20 66 69 6c 65 20 61 6e 64 20 61 0a 20 20 20 20   file and a.    
18710 2a 2a 20 6d 79 73 74 65 72 69 6f 75 73 20 6a 6f  ** mysterious jo
18720 75 72 6e 61 6c 20 68 61 73 20 61 70 70 65 61 72  urnal has appear
18730 65 64 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ed in the filesy
18740 73 74 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  stem..    */.   
18750 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
18760 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
18770 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
18780 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
18790 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
187a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
187b0 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
187c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
187d0 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
187e0 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
187f0 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
18800 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
18810 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
18820 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
18830 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  it() is called..
18840 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
18850 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
18860 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
18870 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
18880 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  close() is calle
18890 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
188a0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20  e3pager_unref() 
188b0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
188c0 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
188d0 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
188e0 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
188f0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
18900 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
18910 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
18920 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
18930 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
18940 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
18950 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
18960 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
18970 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
18980 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
18990 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
189a0 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
189b0 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
189c0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
189d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
189e0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
189f0 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
18a00 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
18a10 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
18a20 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
18a30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18a40 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
18a50 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
18a60 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
18a70 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
18a80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
18a90 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
18aa0 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
18ab0 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
18ac0 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
18ad0 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
18ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18af0 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
18b00 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
18b10 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
18b20 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
18b30 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
18b40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
18b50 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
18b60 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
18b70 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18b80 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
18b90 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
18ba0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
18bb0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
18bc0 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
18bd0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
18be0 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
18bf0 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
18c00 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
18c10 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
18c20 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
18c30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
18c40 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
18c50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
18c60 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20  ager_begin(void 
18c70 2a 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46 6c  *pData, int exFl
18c80 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ag){.  PgHdr *pP
18c90 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
18ca0 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
18cb0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
18cc0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
18cd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18ce0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
18cf0 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
18d00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
18d10 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
18d20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
18d30 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
18d40 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
18d50 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
18d60 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
18d70 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
18d80 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
18d90 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
18da0 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
18db0 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
18dc0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
18dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
18de0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
18df0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
18e00 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
18e10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18e30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
18e40 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
18e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46  .        if( exF
18e60 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
18e70 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
18e80 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
18e90 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
18ea0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18eb0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
18ec0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18ed0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18ef0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
18f00 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52  he = 0;.      TR
18f10 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE2("TRANSACTIO
18f20 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
18f30 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
18f40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
18f50 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
18f60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
18f70 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
18f80 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
18f90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
18fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
18fb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18fc0 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72   Make a page dir
18fd0 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72  ty.  Set its dir
18fe0 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20  ty flag and add 
18ff0 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a  it to the dirty.
19000 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ** page list..*/
19010 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
19020 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50  eDirty(PgHdr *pP
19030 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
19040 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50  irty==0 ){.    P
19050 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
19060 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
19070 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
19080 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
19090 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  = pPager->pDirty
190a0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
190b0 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
190c0 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
190d0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
190e0 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  Pg;.    }.    pP
190f0 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  g->pPrevDirty = 
19100 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
19110 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d  Dirty = pPg;.  }
19120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
19130 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c   page clean.  Cl
19140 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69  ear its dirty bi
19150 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20  t and remove it 
19160 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74  from the.** dirt
19170 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  y page list..*/.
19180 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
19190 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67  Clean(PgHdr *pPg
191a0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
191b0 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  rty ){.    pPg->
191c0 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69  dirty = 0;.    i
191d0 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29  f( pPg->pDirty )
191e0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  {.      pPg->pDi
191f0 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
19200 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  = pPg->pPrevDirt
19210 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
19220 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
19230 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
19240 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
19250 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
19260 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19270 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
19280 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
19290 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rty;.    }.  }.}
192a0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  .../*.** Mark a 
192b0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
192c0 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
192d0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
192e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
192f0 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
19300 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
19310 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
19320 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
19330 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
19340 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
19350 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
19360 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
19370 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
19380 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
19390 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
193a0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
193b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
193c0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
193d0 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
193e0 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
193f0 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
19400 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19410 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
19420 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
19430 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
19440 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
19450 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
19460 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
19470 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
19480 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
19490 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
194a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
194b0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
194c0 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
194d0 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
194e0 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
194f0 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
19500 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
19510 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
19520 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
19530 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
19540 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
19550 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
19560 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
19570 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
19580 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
19590 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
195a0 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  commit() or sqli
195b0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
195c0 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
195d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
195e0 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20  ager_write(void 
195f0 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
19600 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
19610 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
19620 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
19630 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
19640 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19650 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
19660 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
19670 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
19680 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
19690 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
196a0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
196b0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
196c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
196d0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
196e0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
196f0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
19700 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
19710 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
19720 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
19730 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
19740 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
19750 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
19760 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
19770 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
19780 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
19790 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
197a0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
197b0 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
197c0 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72  inStmt || pPager
197d0 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20  ->stmtInUse==0) 
197e0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
197f0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
19800 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
19810 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
19820 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
19830 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
19840 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
19850 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
19860 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
19870 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
19880 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
19890 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
198a0 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
198b0 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
198c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
198d0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
198e0 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
198f0 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
19900 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
19910 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19920 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
19930 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
19940 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67  sqlite3pager_beg
19950 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20  in(pData, 0);.  
19960 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19970 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
19980 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
19990 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
199a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
199b0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
199c0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
199d0 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
199e0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
199f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
19a00 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
19a10 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
19a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19a30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
19a40 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
19a50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
19a60 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
19a70 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
19a80 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
19a90 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  che = 1;.  .    
19aa0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
19ab0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
19ac0 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
19ad0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
19ae0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
19af0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
19b00 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
19b10 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
19b20 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
19b30 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
19b40 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
19b50 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
19b60 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
19b70 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69  .    if( !pPg->i
19b80 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
19b90 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
19ba0 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
19bb0 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
19bc0 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
19bd0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
19be0 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b         int szPg;
19bf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d  .        if( MEM
19c00 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
19c10 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
19c20 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
19c30 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
19c40 20 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28           TRACE3(
19c50 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
19c60 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19c70 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
19c80 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  no);.          a
19c90 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f  ssert( pHist->pO
19ca0 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rig==0 );.      
19cb0 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67      pHist->pOrig
19cc0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
19cd0 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
19ce0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
19cf0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
19d00 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ig ){.          
19d10 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
19d20 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f  pOrig, PGHDR_TO_
19d30 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
19d40 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
19d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19d70 20 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73 61     u32 cksum, sa
19d80 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ved;.          c
19d90 68 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70 45  har *pData2, *pE
19da0 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  nd;.          /*
19db0 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
19dc0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
19dd0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
19de0 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
19df0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74     ** contains t
19e00 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
19e10 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
19e20 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65  g assert verifie
19e30 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  s.          ** t
19e40 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
19e50 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
19e60 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
19e70 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
19e80 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ger) );.        
19e90 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43    pData2 = CODEC
19ea0 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
19eb0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
19ec0 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20            cksum 
19ed0 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
19ee0 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
19ef0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  2);.          pE
19f00 6e 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70 50  nd = pData2 + pP
19f10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
19f20 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
19f30 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   -= 4;.         
19f40 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
19f50 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20  pEnd;.          
19f60 70 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c 20  put32bits(pEnd, 
19f70 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
19f80 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d    szPg = pPager-
19f90 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20  >pageSize+8;.   
19fa0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
19fb0 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67  (pData2, pPg->pg
19fc0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
19fd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
19fe0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
19ff0 70 44 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20  pData2, szPg);. 
1a000 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1a010 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
1a020 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
1a030 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20  , pPg->pgno,.   
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a050 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a060 66 66 2c 20 73 7a 50 67 29 29 0a 20 20 20 20 20  ff, szPg)).     
1a070 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1a080 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b  rnalOff += szPg;
1a090 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
1a0a0 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  4("JOURNAL %d pa
1a0b0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
1a0c0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1a0d0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1a0e0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1a0f0 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
1a100 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  c);.          *(
1a110 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65  u32*)pEnd = save
1a120 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72  d;...  /* An err
1a130 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
1a140 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
1a150 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
1a160 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72  .          ** tr
1a170 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
1a180 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
1a190 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
1a1a0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1a1b0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1a1c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a1d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1a1e0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
1a1f0 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ..          pPag
1a200 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
1a210 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1a220 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a230 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1a240 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1a250 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
1a260 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1a270 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
1a280 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1a290 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
1a2a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1a2b0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1a2c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1a2d0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1a2e0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1a2f0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1a300 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ;.            pa
1a310 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
1a320 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
1a330 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1a340 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a350 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1a360 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f  nc = !pPager->jo
1a370 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
1a380 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
1a390 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 34 28  .        TRACE4(
1a3a0 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
1a3b0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
1a3c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a3d0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1a3e0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1a3f0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
1a400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1a410 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
1a420 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1a430 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1a440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1a450 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1a460 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
1a470 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
1a480 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
1a490 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
1a4a0 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
1a4b0 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
1a4c0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1a4d0 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
1a4e0 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
1a4f0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
1a500 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1a510 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
1a520 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
1a530 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
1a540 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
1a550 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
1a560 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
1a570 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
1a580 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a590 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50  stmtInUse && !pP
1a5a0 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e  g->inStmt && (in
1a5b0 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
1a5c0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b  ger->stmtSize ){
1a5d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a5e0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
1a5f0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
1a600 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1a610 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
1a620 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1a630 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1a640 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1a650 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1a660 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a670 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
1a680 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1a690 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
1a6a0 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
1a6b0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
1a6c0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1a6d0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1a6e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
1a6f0 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
1a700 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1a710 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1a720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a730 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d     TRACE3("STMT-
1a740 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1a750 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1a760 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1a770 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
1a780 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1a790 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
1a7a0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1a7b0 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20  g->pgno, 7)-4;. 
1a7c0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
1a7d0 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67  (pData2, pPg->pg
1a7e0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
1a7f0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1a800 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70  (pPager->stfd, p
1a810 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1a820 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
1a830 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
1a840 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
1a850 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1a860 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1a870 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
1a880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a890 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1a8a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1a8b0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1a8c0 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
1a8d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1a8e0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
1a8f0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
1a900 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1a910 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1a920 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1a930 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f     }.      page_
1a940 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1a950 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1a960 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
1a970 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1a980 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
1a990 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a9a0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1a9b0 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
1a9c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
1a9d0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
1a9e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
1a9f0 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
1aa00 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
1aa10 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
1aa20 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
1aa30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1aa40 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1aa50 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
1aa60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1aa70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1aa80 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
1aa90 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
1aaa0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
1aab0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
1aac0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ** to sqlite3pag
1aad0 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e 20  er_write().  In 
1aae0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
1aaf0 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
1ab00 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
1ab10 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1ab20 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
1ab30 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
1ab40 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
1ab50 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a  writeable(void *
1ab60 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
1ab70 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
1ab80 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72  GHDR(pData);.  r
1ab90 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
1aba0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
1abb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1abc0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70  VACUUM./*.** Rep
1abd0 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
1abe0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
1abf0 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72  e with the infor
1ac00 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68  mation in the th
1ac10 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ird.** argument.
1ac20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1ac30 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50  ager_overwrite(P
1ac40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1ac50 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70  no pgno, void *p
1ac60 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Data){.  void *p
1ac70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
1ac80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
1ac90 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
1aca0 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a   pgno, &pPage);.
1acb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1acc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1acd0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1ace0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  te(pPage);.    i
1acf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ad00 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1ad10 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 70  (pPage, pData, p
1ad20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1ad30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1ad40 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
1ad50 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
1ad60 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1ad70 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
1ad80 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
1ad90 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
1ada0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
1adb0 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
1adc0 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
1add0 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e  ion on page "pgn
1ade0 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  o" back to the d
1adf0 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
1ae00 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
1ae10 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
1ae20 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
1ae30 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
1ae40 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
1ae50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
1ae60 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
1ae70 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
1ae80 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
1ae90 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
1aea0 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
1aeb0 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
1aec0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
1aed0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
1aee0 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
1aef0 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
1af00 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
1af10 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
1af20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
1af30 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  t_rollback() bel
1af40 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
1af50 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
1af60 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
1af70 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
1af80 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
1af90 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
1afa0 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
1afb0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1afc0 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
1afd0 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
1afe0 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
1aff0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
1b000 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ls to sqlite3pag
1b010 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
1b020 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
1b030 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
1b040 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
1b050 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
1b060 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
1b070 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
1b080 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
1b090 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
1b0a0 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1b0b0 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
1b0c0 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
1b0d0 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
1b0e0 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
1b0f0 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
1b100 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
1b110 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
1b120 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
1b130 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1b140 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
1b150 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
1b160 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
1b170 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1b180 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
1b190 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f  ed,.** the dont_
1b1a0 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  rollback() routi
1b1b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
1b1c0 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ut because the p
1b1d0 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  age contains.** 
1b1e0 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
1b1f0 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
1b200 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20  be sure it gets 
1b210 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
1b220 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64  pite.** of the d
1b230 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63  ont_rollback() c
1b240 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
1b250 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77  ite3pager_dont_w
1b260 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
1b270 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
1b280 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1b290 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74   if( MEMDB ) ret
1b2a0 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  urn;..  pPg = pa
1b2b0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1b2c0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
1b2d0 72 74 28 20 70 50 67 21 3d 30 20 29 3b 20 20 2f  rt( pPg!=0 );  /
1b2e0 2a 20 57 65 20 6e 65 76 65 72 20 63 61 6c 6c 20  * We never call 
1b2f0 5f 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e 6c 65  _dont_write unle
1b300 73 73 20 74 68 65 20 70 61 67 65 20 69 73 20 69  ss the page is i
1b310 6e 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e  n mem */.  pPg->
1b320 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1b330 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64   1;.  if( pPg->d
1b340 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d  irty && !pPager-
1b350 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1b360 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b370 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
1b380 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
1b390 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1b3a0 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
1b3b0 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
1b3c0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
1b3d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
1b3e0 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
1b3f0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1b400 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
1b410 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
1b420 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
1b430 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
1b440 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1b450 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
1b460 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
1b470 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
1b480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b490 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
1b4a0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1b4b0 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
1b4c0 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
1b4d0 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
1b4e0 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
1b4f0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
1b500 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
1b510 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
1b520 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
1b530 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
1b540 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
1b550 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
1b560 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
1b570 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
1b580 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
1b590 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
1b5a0 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
1b5b0 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
1b5c0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1b5d0 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
1b5e0 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
1b5f0 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
1b600 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41   %d\n", pgno, PA
1b610 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1b620 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1b630 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
1b640 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20  pPager, pgno)). 
1b650 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
1b660 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
1b670 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1b680 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
1b690 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1b6a0 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
1b6b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1b6c0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1b6d0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1b6e0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1b6f0 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
1b700 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
1b710 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
1b720 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1b730 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1b740 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
1b750 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1b760 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
1b770 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
1b780 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
1b790 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
1b7a0 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nal..*/.void sql
1b7b0 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
1b7c0 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44  ollback(void *pD
1b7d0 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
1b7e0 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1b7f0 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
1b800 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1b810 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73  ->pPager;..  ass
1b820 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1b830 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1b840 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1b850 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1b860 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1b870 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
1b880 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
1b890 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1b8a0 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75   || MEMDB ) retu
1b8b0 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
1b8c0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
1b8d0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
1b8e0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1b8f0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1b900 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1b910 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
1b920 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1b930 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1b940 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1b950 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
1b960 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
1b970 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1b980 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
1b990 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1b9a0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1b9b0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1b9c0 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
1b9d0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
1b9e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
1b9f0 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
1ba00 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
1ba10 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
1ba20 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1ba30 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 47  .    IOTRACE(("G
1ba40 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
1ba50 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1ba60 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20 70  no)).  }.  if( p
1ba70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1ba80 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
1ba90 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1baa0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
1bab0 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
1bac0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1bad0 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1bae0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1baf0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
1bb00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1bb10 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
1bb20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1bb30 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1bb40 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1bb50 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f  );.    page_add_
1bb60 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1bb70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1bb80 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
1bb90 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
1bba0 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
1bbb0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
1bbc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
1bbd0 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
1bbe0 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
1bbf0 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
1bc00 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
1bc10 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1bc20 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
1bc30 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
1bc40 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
1bc50 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
1bc60 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
1bc70 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
1bc80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
1bc90 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
1bca0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1bcb0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
1bcc0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1bcd0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1bce0 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
1bcf0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
1bd00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1bd10 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32  OR;.  }.  TRACE2
1bd20 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
1bd30 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1bd40 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
1bd50 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
1bd60 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
1bd70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
1bd80 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
1bd90 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
1bda0 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ry(PGHDR_TO_HIST
1bdb0 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a  (pPg, pPager));.
1bdc0 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
1bdd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1bde0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
1bdf0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
1be00 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
1be10 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1be20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
1be30 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
1be40 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
1be50 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72   pPg = pPg->pDir
1be60 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ty;.    }.    pP
1be70 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
1be80 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
1be90 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
1bea0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
1beb0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
1bec0 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
1bed0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1bee0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1bef0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
1bf00 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
1bf10 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
1bf20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
1bf30 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
1bf40 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
1bf50 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
1bf60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
1bf70 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
1bf80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
1bf90 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
1bfa0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
1bfb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1bfc0 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  f( pPager->dirty
1bfd0 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Cache==0 ){.    
1bfe0 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77  /* Exit early (w
1bff0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65  ithout doing the
1c000 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20   time-consuming 
1c010 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
1c020 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66  calls).    ** if
1c030 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
1c040 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74   no changes to t
1c050 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c060 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1c070 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1c080 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  c==0 );.    rc =
1c090 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
1c0a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1c0b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1c0c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c0d0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1c0e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1c0f0 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c  ger_sync(pPager,
1c100 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
1c110 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c120 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
1c130 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
1c140 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1c150 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
1c160 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
1c170 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
1c180 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
1c190 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
1c1a0 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
1c1b0 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
1c1c0 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
1c1d0 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
1c1e0 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
1c1f0 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
1c200 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1c210 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
1c220 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
1c230 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
1c240 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
1c250 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
1c260 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
1c270 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
1c280 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
1c290 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
1c2a0 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
1c2b0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1c2c0 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
1c2d0 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
1c2e0 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
1c2f0 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
1c300 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
1c310 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
1c320 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
1c330 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
1c340 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
1c350 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
1c360 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1c370 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1c380 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
1c390 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1c3a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43    int rc;.  TRAC
1c3b0 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
1c3c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1c3d0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
1c3e0 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  B ){.    PgHdr *
1c3f0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
1c400 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
1c410 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
1c420 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1c430 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Hist;.      asse
1c440 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f  rt( !p->alwaysRo
1c450 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
1c460 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b  if( !p->dirty ){
1c470 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c480 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
1c490 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1c4a0 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
1c4b0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
1c4c0 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
1c4d0 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
1c4e0 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
1c4f0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
1c500 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
1c510 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
1c520 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
1c530 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
1c540 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
1c550 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
1c560 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
1c570 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
1c580 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
1c590 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ize);.        TR
1c5a0 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50  ACE3("ROLLBACK-P
1c5b0 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  AGE %d of %d\n",
1c5c0 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
1c5d0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1c5e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c5f0 20 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64   TRACE3("PAGE %d
1c600 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
1c610 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
1c620 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1c630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
1c640 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
1c650 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
1c660 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
1c670 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
1c680 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20      p->inStmt = 
1c690 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  0;.      p->pPre
1c6a0 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74  vStmt = p->pNext
1c6b0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1c6c0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
1c6d0 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
1c6e0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1c6f0 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
1c700 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  (p), pPager->pag
1c710 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
1c720 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1c730 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
1c740 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1c750 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1c760 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1c770 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
1c780 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1c790 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1c7a0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1c7b0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1c7c0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1c7d0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
1c7e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1c7f0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1c800 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
1c810 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c820 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1c830 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1c840 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  k(pPager);.    r
1c850 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
1c860 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1c870 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
1c880 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
1c890 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
1c8a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c8b0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
1c8c0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
1c8d0 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
1c8e0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1c8f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1c900 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1c910 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1c920 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
1c930 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63   int rc2;.    rc
1c940 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f   = pager_reload_
1c950 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
1c960 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75     rc2 = pager_u
1c970 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
1c980 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
1c990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c9a0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
1c9b0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1c9c0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1c9d0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
1c9e0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1c9f0 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66  e = -1;..  /* If
1ca00 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1ca10 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41   during a ROLLBA
1ca20 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f  CK, we can no lo
1ca30 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70  nger trust the p
1ca40 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e  ager.  ** cache.
1ca50 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
1ca60 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
1ca70 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
1ca80 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65  y error .  ** pe
1ca90 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20  rsistent..  */. 
1caa0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1cab0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1cac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1cad0 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
1cae0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
1caf0 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
1cb00 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
1cb10 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1cb20 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
1cb30 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
1cb40 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
1cb50 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
1cb60 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1cb70 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
1cb80 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
1cb90 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1cba0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
1cbb0 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
1cbc0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
1cbd0 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
1cbe0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1cbf0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d   pPager->nRef;.}
1cc00 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1cc10 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
1cc20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1cc30 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
1cc40 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
1cc50 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 70 61  /.int *sqlite3pa
1cc60 67 65 72 5f 73 74 61 74 73 28 50 61 67 65 72 20  ger_stats(Pager 
1cc70 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74  *pPager){.  stat
1cc80 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20  ic int a[11];.  
1cc90 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[0] = pPager->n
1cca0 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50  Ref;.  a[1] = pP
1ccb0 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61  ager->nPage;.  a
1ccc0 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78  [2] = pPager->mx
1ccd0 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70  Page;.  a[3] = p
1cce0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1ccf0 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
1cd00 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
1cd10 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1cd20 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
1cd30 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
1cd40 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
1cd50 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d    a[8] = pPager-
1cd60 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d  >nOvfl;.  a[9] =
1cd70 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
1cd80 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
1cd90 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  ->nWrite;.  retu
1cda0 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn a;.}.#endif..
1cdb0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74  /*.** Set the st
1cdc0 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
1cdd0 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   point..**.** Th
1cde0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
1cdf0 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
1ce00 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ce10 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
1ce20 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
1ce30 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1ce40 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
1ce50 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
1ce60 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
1ce70 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
1ce80 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69  e SQL command wi
1ce90 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72  thin a larger tr
1cea0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
1ceb0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
1cec0 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20  tmt_begin(Pager 
1ced0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1cee0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  rc;.  assert( !p
1cef0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1cf00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1cf10 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1cf20 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61  ER_SHARED );.  a
1cf30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1cf40 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52  bSize>=0 );.  TR
1cf50 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
1cf60 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1cf70 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
1cf80 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
1cf90 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
1cfa0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1cfb0 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
1cfc0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
1cfd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1cfe0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
1cff0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1d000 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
1d010 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
1d020 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d030 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
1d040 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1d050 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50  rnalOpen );.  pP
1d060 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
1d070 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
1d080 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1d090 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
1d0a0 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29  er->aInStmt==0 )
1d0b0 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  {.    /* sqlite3
1d0c0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
1d0d0 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
1d0e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1d0f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1d100 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1d110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1d120 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1d130 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73  >jfd, &pPager->s
1d140 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
1d150 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
1d160 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
1d170 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d180 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61  stmtJSize == pPa
1d190 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1d1a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
1d1b0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
1d1c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d1d0 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
1d1e0 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
1d1f0 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
1d200 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
1d210 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
1d220 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
1d230 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
1d240 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
1d250 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1d260 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
1d270 6e 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73  ntemp(&pPager->s
1d280 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tfd);.    if( rc
1d290 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
1d2a0 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70  in_failed;.    p
1d2b0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
1d2c0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
1d2d0 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
1d2e0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
1d2f0 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
1d300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d310 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
1d320 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
1d330 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->aInStmt ){.  
1d340 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
1d350 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20  ger->aInStmt);. 
1d360 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1d370 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
1d380 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d390 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
1d3a0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
1d3b0 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
1d3c0 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
1d3d0 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
1d3e0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1d3f0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c  .    PgHdr *pPg,
1d400 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41   *pNext;.    TRA
1d410 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54  CE2("STMT-COMMIT
1d420 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1d430 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
1d440 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
1d450 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
1d460 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
1d470 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
1d480 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
1d490 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
1d4a0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  /.      sqliteFr
1d4b0 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ee( pPager->aInS
1d4c0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61  tmt );.      pPa
1d4d0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
1d4e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1d4f0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
1d500 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  t; pPg; pPg=pNex
1d510 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
1d520 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
1d530 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1d540 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20  pPg->inStmt );. 
1d550 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
1d560 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1d570 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
1d580 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
1d590 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
1d5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
1d5b0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1d5c0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1d5d0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1d5e0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
1d5f0 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
1d600 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1d610 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1d620 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1d630 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
1d640 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
1d650 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
1d660 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
1d670 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
1d680 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
1d690 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d6a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
1d6b0 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
1d6c0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1d6d0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c  e3pager_stmt_rol
1d6e0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
1d6f0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1d700 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1d710 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54  mtInUse ){.    T
1d720 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
1d730 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
1d740 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1d750 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1d760 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
1d770 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
1d780 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
1d790 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
1d7a0 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
1d7b0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1d7c0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1d7d0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1d7e0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1d7f0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1d800 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
1d810 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1d820 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
1d830 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1d840 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1d850 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
1d860 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
1d870 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
1d880 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d890 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1d8a0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1d8b0 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
1d8c0 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1d8d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1d8e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d8f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d900 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
1d910 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1d920 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1d930 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
1d940 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
1d950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1d960 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d970 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
1d980 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
1d990 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d9a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
1d9b0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
1d9c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1d9d0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1d9e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c  sqlite3pager_fil
1d9f0 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
1da00 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1da10 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1da20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1da30 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
1da40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1da50 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
1da60 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
1da70 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20  r_dirname(Pager 
1da80 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1da90 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
1daa0 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
1dab0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
1dac0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
1dad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
1dae0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1daf0 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61  ite3pager_journa
1db00 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
1db10 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1db20 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
1db30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1db40 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
1db50 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
1db60 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
1db70 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
1db80 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
1db90 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
1dba0 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
1dbb0 71 6c 69 74 65 33 70 61 67 65 72 5f 6e 6f 73 79  qlite3pager_nosy
1dbc0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
1dbd0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1dbe0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f  er->noSync;.}../
1dbf0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
1dc00 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
1dc10 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
1dc20 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63  3pager_set_codec
1dc30 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1dc40 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  r,.  void *(*xCo
1dc50 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
1dc60 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
1dc70 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
1dc80 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
1dc90 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
1dca0 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
1dcb0 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a  = pCodecArg;.}..
1dcc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1dcd0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1dce0 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1dcf0 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1dd00 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1dd10 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1dd20 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1dd30 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1dd40 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1dd50 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1dd60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69   *pPager){.  voi
1dd70 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64  d *pPage;.  PgHd
1dd80 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
1dd90 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1dda0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1ddb0 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
1ddc0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
1ddd0 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
1dde0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1ddf0 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61  (pPager, 1, &pPa
1de00 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1de10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1de20 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
1de30 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1de40 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1de50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1de60 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52  turn rc;..  /* R
1de70 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ead the current 
1de80 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34  value at byte 24
1de90 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20  . */.  pPgHdr = 
1dea0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50  DATA_TO_PGHDR(pP
1deb0 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63  age);.  change_c
1dec0 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76  ounter = retriev
1ded0 65 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20  e32bits(pPgHdr, 
1dee0 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  24);..  /* Incre
1def0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1df00 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1df10 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1df20 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e  te 24. */.  chan
1df30 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
1df40 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1df50 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
1df60 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61  pPgHdr))+24, cha
1df70 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20  nge_counter);.. 
1df80 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1df90 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1dfa0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  */.  sqlite3page
1dfb0 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1dfc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dfd0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
1dfe0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1dff0 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1e000 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1e010 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1e020 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1e030 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1e040 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1e050 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1e060 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1e070 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1e080 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1e090 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1e0a0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1e0b0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1e0c0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1e0d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1e0e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e0f0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1e100 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1e110 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1e120 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1e130 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1e140 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1e150 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1e160 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1e170 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1e180 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1e190 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1e1a0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1e1b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1e1c0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1e1d0 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1e1e0 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1e1f0 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1e200 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1e210 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1e220 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1e230 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1e240 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1e250 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  nc() call..**.**
1e260 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1e270 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1e280 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1e290 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1e2a0 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1e2b0 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1e2c0 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1e2d0 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1e2e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1e2f0 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  er_sync(Pager *p
1e300 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
1e310 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f  r *zMaster, Pgno
1e320 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20   nTrunc){.  int 
1e330 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e340 0a 20 20 54 52 41 43 45 34 28 22 44 41 54 41 42  .  TRACE4("DATAB
1e350 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
1e360 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
1e370 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
1e380 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
1e390 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
1e3a0 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  runc);..  /* If 
1e3b0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1e3c0 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
1e3d0 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
1e3e0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
1e3f0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1e400 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1e410 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
1e420 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
1e430 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1e440 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
1e450 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
1e460 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1e470 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1e480 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
1e490 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1e4a0 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  en );..    /* If
1e4b0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1e4c0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
1e4d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1e4e0 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
1e4f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
1e500 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
1e510 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
1e520 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
1e530 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
1e540 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
1e550 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
1e560 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
1e570 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
1e580 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1e590 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
1e5a0 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
1e5b0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
1e5c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1e5d0 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
1e5e0 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
1e5f0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
1e600 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1e610 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1e620 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
1e630 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1e640 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
1e650 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e660 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1e670 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
1e680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e690 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1e6a0 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1e6b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
1e6c0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1e6d0 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
1e6e0 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
1e6f0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
1e700 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
1e710 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
1e720 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
1e730 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1e740 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1e750 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1e760 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1e770 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76  gno i;.        v
1e780 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
1e790 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20      int iSkip = 
1e7a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1e7b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ager);.        f
1e7c0 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
1e7d0 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
1e7e0 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
1e7f0 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50          if( !(pP
1e800 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1e810 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37  [i/8] & (1<<(i&7
1e820 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20  ))) && i!=iSkip 
1e830 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1e840 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1e850 5f 67 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  _get(pPager, i, 
1e860 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
1e870 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e880 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1e890 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1e8a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e8b0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1e8c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1e8d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1e8e0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1e8f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1e900 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1e910 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1e920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e930 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  } .      }.#endi
1e940 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  f.      rc = wri
1e950 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1e960 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1e970 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e980 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1e990 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1e9a0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
1e9b0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1e9c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e9d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1e9e0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  exit;.    }..#if
1e9f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ea00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1ea10 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1ea20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ea30 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
1ea40 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1ea50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1ea60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1ea70 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1ea80 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1ea90 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
1eaa0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
1eab0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1eac0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1ead0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1eae0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1eaf0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1eb00 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
1eb10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1eb20 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1eb30 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
1eb40 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1eb50 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1eb60 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1eb70 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
1eb80 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1eb90 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
1eba0 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
1ebb0 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22  E(("DBSYNC %p\n"
1ebc0 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
1ebd0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1ebe0 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
1ebf0 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20  }else if( MEMDB 
1ec00 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  && nTrunc!=0 ){.
1ec10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ec20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1ec30 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
1ec40 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
1ec50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ec60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ec70 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
1ec80 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
1ec90 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
1eca0 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69   pData to locati
1ecb0 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
1ecc0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile. .**.** Ther
1ecd0 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
1ece0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63  erences to the c
1ecf0 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f  urrent page pgno
1ed00 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67  . If current pag
1ed10 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74  e.** pgno is not
1ed20 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1ed30 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ed40 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74  , it is not writ
1ed50 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20  ten there by.** 
1ed60 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
1ed70 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65   The same applie
1ed80 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44  s to the page pD
1ed90 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e  ata refers to on
1eda0 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69   entry to.** thi
1edb0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1edc0 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
1edd0 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20  he page refered 
1ede0 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61  to by pData rema
1edf0 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
1ee00 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
1ee10 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
1ee20 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28  ith page pData (
1ee30 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
1ee40 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
1ee50 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
1ee60 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
1ee70 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
1ee80 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1ee90 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
1eea0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
1eeb0 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
1eec0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1eed0 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
1eee0 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
1eef0 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
1ef00 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1ef10 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
1ef20 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
1ef30 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
1ef40 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
1ef50 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
1ef60 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
1ef70 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
1ef80 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1ef90 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e  s active)..*/.in
1efa0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d  t sqlite3pager_m
1efb0 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
1efc0 50 61 67 65 72 2c 20 76 6f 69 64 20 2a 70 44 61  Pager, void *pDa
1efd0 74 61 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  ta, Pgno pgno){.
1efe0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
1eff0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
1f000 74 61 29 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta);.  PgHdr *pP
1f010 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a  gOld; .  int h;.
1f020 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
1f030 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  gno = 0;..  asse
1f040 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
1f050 29 3b 0a 0a 20 20 54 52 41 43 45 35 28 22 4d 4f  );..  TRACE5("MO
1f060 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
1f070 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
1f080 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
1f090 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1f0a0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1f0b0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
1f0c0 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  no);.  IOTRACE((
1f0d0 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
1f0e0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1f0f0 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
1f100 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
1f110 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  c ){.    needSyn
1f120 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
1f130 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
1f140 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b  Pg->inJournal );
1f150 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1f160 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61  ->dirty );.    a
1f170 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1f180 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
1f190 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20    /* Unlink pPg 
1f1a0 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63  from it's hash-c
1f1b0 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  hain */.  unlink
1f1c0 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
1f1d0 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  , pPg);..  /* If
1f1e0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
1f1f0 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
1f200 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
1f210 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
1f220 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20   from it's hash 
1f230 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
1f240 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
1f250 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
1f260 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
1f270 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
1f280 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
1f290 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
1f2a0 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
1f2b0 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
1f2c0 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c  re..  */.  pPgOl
1f2d0 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  d = pager_lookup
1f2e0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
1f2f0 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
1f300 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f      assert( pPgO
1f310 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  ld->nRef==0 );. 
1f320 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61     unlinkHashCha
1f330 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c  in(pPager, pPgOl
1f340 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61  d);.    makeClea
1f350 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69  n(pPgOld);.    i
1f360 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53  f( pPgOld->needS
1f370 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ync ){.      ass
1f380 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a  ert( pPgOld->inJ
1f390 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20  ournal );.      
1f3a0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1f3b0 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   1;.      pPg->n
1f3c0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1f3d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1f3e0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
1f3f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
1f400 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e  hange the page n
1f410 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e  umber for pPg an
1f420 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
1f430 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68   the new hash-ch
1f440 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ain. */.  assert
1f450 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70  ( pgno!=0 );.  p
1f460 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
1f470 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70  .  h = pgno & (p
1f480 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
1f490 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
1f4a0 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61  Hash[h] ){.    a
1f4b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1f4c0 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
1f4d0 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  sh==0 );.    pPa
1f4e0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
1f4f0 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
1f500 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
1f510 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
1f520 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65  Hash[h];.  pPage
1f530 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
1f540 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48  g;.  pPg->pPrevH
1f550 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65  ash = 0;..  make
1f560 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
1f570 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1f580 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
1f590 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
1f5a0 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
1f5b0 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
1f5c0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1f5d0 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
1f5e0 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
1f5f0 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
1f600 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
1f610 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
1f620 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
1f630 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
1f640 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
1f650 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
1f660 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
1f670 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  he .    ** Pager
1f680 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20  .aInJournal bit 
1f690 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
1f6a0 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
1f6b0 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69  emedied by loadi
1f6c0 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  ng.    ** the pa
1f6d0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
1f6e0 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
1f6f0 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
1f700 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20  edSync flag..   
1f710 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
1f720 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1f730 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
1f740 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
1f750 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
1f760 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
1f770 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
1f780 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
1f790 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b    */.    int rc;
1f7a0 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64  .    void *pNeed
1f7b0 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74  Sync;.    assert
1f7c0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1f7d0 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nc );.    rc = s
1f7e0 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1f7f0 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
1f800 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63  Pgno, &pNeedSync
1f810 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f820 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1f830 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
1f840 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1f850 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44      DATA_TO_PGHD
1f860 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65  R(pNeedSync)->ne
1f870 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1f880 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e  DATA_TO_PGHDR(pN
1f890 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72  eedSync)->inJour
1f8a0 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b  nal = 1;.    mak
1f8b0 65 44 69 72 74 79 28 44 41 54 41 5f 54 4f 5f 50  eDirty(DATA_TO_P
1f8c0 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29 29  GHDR(pNeedSync))
1f8d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  ;.    sqlite3pag
1f8e0 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79  er_unref(pNeedSy
1f8f0 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  nc);.  }..  retu
1f900 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f910 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1f920 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1f930 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1f940 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
1f950 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1f960 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
1f970 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68  file lock for th
1f980 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
1f990 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
1f9a0 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f  ue is one of NO_
1f9b0 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
1f9c0 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
1f9d0 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ,.** PENDING_LOC
1f9e0 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  K, or EXCLUSIVE_
1f9f0 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  LOCK..*/.int sql
1fa00 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74  ite3pager_lockst
1fa10 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
1fa20 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
1fa30 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28  ite3OsLockState(
1fa40 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23  pPager->fd);.}.#
1fa50 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1fa60 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1fa70 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67   Print a listing
1fa80 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63   of all referenc
1fa90 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ed pages and the
1faa0 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f  ir ref count..*/
1fab0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
1fac0 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72  er_refdump(Pager
1fad0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
1fae0 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
1faf0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
1fb00 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1fb10 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
1fb20 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
1fb30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
1fb40 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1fb50 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72  f("PAGE %3d addr
1fb60 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20  =%p nRef=%d\n", 
1fb70 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  .       pPg->pgn
1fb80 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
1fb90 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
1fba0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
1fbb0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1fbc0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
1fbd0 0a                                               .