/ Hex Artifact Content
Login

Artifact 8a64e448f4c6ff72d27e97df28f1c44e28bc2238:


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 35 33  : pager.c,v 1.53
0350: 34 20 32 30 30 39 2f 30 31 2f 30 36 20 31 35 3a  4 2009/01/06 15:
0360: 35 38 3a 35 37 20 64 72 68 20 45 78 70 20 24 0a  58:57 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 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65  #if 0.int sqlite
03f0: 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b 20 20  3PagerTrace=1;  
0400: 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c  /* True to enabl
0410: 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 64 65  e tracing */.#de
0420: 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62 75  fine sqlite3Debu
0430: 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a 23  gPrintf printf.#
0440: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
0450: 45 28 58 29 20 20 20 20 20 69 66 28 20 73 71 6c  E(X)     if( sql
0460: 69 74 65 33 50 61 67 65 72 54 72 61 63 65 20 29  ite3PagerTrace )
0470: 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  { sqlite3DebugPr
0480: 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73 65 0a  intf X; }.#else.
0490: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04a0: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
04b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
04c0: 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65  g two macros are
04d0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65   used within the
04e0: 20 50 41 47 45 52 54 52 41 43 45 28 29 20 6d 61   PAGERTRACE() ma
04f0: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0500: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0510: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0520: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0530: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0540: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
0550: 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e  as its argument.
0560: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0570: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0580: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0590: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
05a0: 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f  akes an sqlite3_
05b0: 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61  file.** struct a
05c0: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a  s its argument..
05d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
05e0: 49 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e  ID(p) ((int)(p->
05f0: 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c  fd)).#define FIL
0600: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28  EHANDLEID(fd) ((
0610: 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54  int)fd)../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0670: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0760: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0860: 56 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72  VED      This pr
0870: 6f 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76  ocess has reserv
0880: 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
0890: 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20  for writing.**  
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74       but has not
08c0: 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68   yet made any ch
08d0: 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65  anges.  Only one
08e0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20   process.**     
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20    at a time can 
0910: 72 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61  reserve the data
0920: 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69  base.  The origi
0930: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0950: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
0960: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
0970: 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   so other.**    
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79     processes may
09a0: 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
09b0: 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a  g the on-disk.**
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
09e0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  file..**.**   PA
09f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
0a00: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0a10: 20 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20   is writing the 
0a20: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63     Access is exc
0a50: 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65  lusive.  No othe
0a60: 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a  r processes or.*
0a70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a80: 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20          threads 
0a90: 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f  can be reading o
0aa0: 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20  r writing while 
0ab0: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  one.**          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0ad0: 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e  cess is writing.
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0af0: 59 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65  YNCED        The
0b00: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
0b10: 74 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20  this state from 
0b20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a  PAGER_EXCLUSIVE.
0b30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b40: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61           after a
0b50: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68  ll dirty pages h
0b60: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
0b70: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0ba0: 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
0bb0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a  been synced to.*
0bc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bd0: 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c          disk. Al
0be0: 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  l that remains t
0bf0: 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76  o do is to remov
0c00: 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  e or.**         
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
0c20: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
0c30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0c40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
0c70: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0c80: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0c90: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0ca0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0cb0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0cc0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0cf0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0d00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0d10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0d20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0d30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0d40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0d50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0d60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0d80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0d90: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0da0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0db0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0dc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0dd0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0de0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0df0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0e00: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0e10: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0e20: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0e30: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0e40: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0e50: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0e60: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e70: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0e80: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0e90: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
0ea0: 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c   is an open roll
0eb0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
0ec0: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0ed0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0ee0: 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65  VE occurs before
0ef0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20   any changes.** 
0f00: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
0f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
0f20: 68 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20  hough writes to 
0f30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
0f40: 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77  journal occurs w
0f50: 69 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52  ith just PAGER_R
0f60: 45 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20  ESERVED.  After 
0f70: 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  an sqlite3PagerR
0f80: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
0f90: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
0fa0: 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68  itPhaseTwo(), th
0fb0: 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62  e state can go b
0fc0: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
0fd0: 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61  RED,.** or it ca
0fe0: 6e 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f  n stay at PAGER_
0ff0: 45 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20  EXCLUSIVE if we 
1000: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
1010: 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f   access mode..*/
1020: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55  .#define PAGER_U
1030: 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65  NLOCK      0.#de
1040: 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45  fine PAGER_SHARE
1050: 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61  D      1   /* sa
1060: 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43  me as SHARED_LOC
1070: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1080: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
1090: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45     /* same as RE
10a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SERVED_LOCK */.#
10b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
10c0: 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20  LUSIVE   4   /* 
10d0: 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56  same as EXCLUSIV
10e0: 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  E_LOCK */.#defin
10f0: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20  e PAGER_SYNCED  
1100: 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 54 68 69      5../*.** Thi
1110: 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20 76  s macro rounds v
1120: 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61 74  alues up so that
1130: 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
1140: 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a 2a   an address it.*
1150: 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  * is guaranteed 
1160: 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73 73  to be an address
1170: 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65 64   that is aligned
1180: 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62 6f   to an 8-byte bo
1190: 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  undary..*/.#defi
11a0: 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45  ne FORCE_ALIGNME
11b0: 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37 29  NT(X)   (((X)+7)
11c0: 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61  &~7)../*.** A ma
11d0: 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76  cro used for inv
11e0: 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20  oking the codec 
11f0: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a  if there is one.
1200: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1210: 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66  _HAS_CODEC.# def
1220: 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e  ine CODEC1(P,D,N
1230: 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65  ,X) if( P->xCode
1240: 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65  c!=0 ){ P->xCode
1250: 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44  c(P->pCodecArg,D
1260: 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e  ,N,X); }.# defin
1270: 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58  e CODEC2(P,D,N,X
1280: 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43  ) ((char*)(P->xC
1290: 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65  odec!=0?P->xCode
12a0: 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44  c(P->pCodecArg,D
12b0: 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a  ,N,X):D)).#else.
12c0: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28  # define CODEC1(
12d0: 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f  P,D,N,X) /* NO-O
12e0: 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f  P */.# define CO
12f0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
1300: 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a  char*)D).#endif.
1310: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
1320: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1330: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
1340: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
1350: 61 63 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 61  ach active.** sa
1360: 76 65 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74  vepoint and stat
1370: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1380: 6e 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e  n in the system.
1390: 20 41 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74   All such struct
13a0: 75 72 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72  ures.** are stor
13b0: 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ed in the Pager.
13c0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
13d0: 61 79 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c  ay, which is all
13e0: 6f 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65  ocated and.** re
13f0: 73 69 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69  sized using sqli
1400: 74 65 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3Realloc()..**
1410: 0a 2a 2a 20 57 68 65 6e 20 61 20 73 61 76 65 70  .** When a savep
1420: 6f 69 6e 74 20 69 73 20 63 72 65 61 74 65 64 2c  oint is created,
1430: 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
1440: 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66  int.iHdrOffset f
1450: 69 65 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74  ield is.** set t
1460: 6f 20 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61  o 0. If a journa
1470: 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l-header is writ
1480: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ten into the mai
1490: 6e 20 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a  n journal while.
14a0: 2a 2a 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  ** the savepoint
14b0: 20 69 73 20 61 63 74 69 76 65 2c 20 74 68 65 6e   is active, then
14c0: 20 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 73   iHdrOffset is s
14d0: 65 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f  et to the byte o
14e0: 66 66 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69  ffset .** immedi
14f0: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
1500: 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c  the last journal
1510: 20 72 65 63 6f 72 64 20 77 72 69 74 74 65 6e 20   record written 
1520: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  into the main.**
1530: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
1540: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
1550: 65 72 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  er. This is requ
1560: 69 72 65 64 20 64 75 72 69 6e 67 20 73 61 76 65  ired during save
1570: 70 6f 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63  point.** rollbac
1580: 6b 20 28 73 65 65 20 70 61 67 65 72 50 6c 61 79  k (see pagerPlay
1590: 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 29 29  backSavepoint())
15a0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
15b0: 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f 69  uct PagerSavepoi
15c0: 6e 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  nt PagerSavepoin
15d0: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 53  t;.struct PagerS
15e0: 61 76 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34  avepoint {.  i64
15f0: 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20   iOffset;       
1600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
1610: 72 74 69 6e 67 20 6f 66 66 73 65 74 20 69 6e 20  rting offset in 
1620: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
1630: 20 20 69 36 34 20 69 48 64 72 4f 66 66 73 65 74    i64 iHdrOffset
1640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1650: 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20  * See above */. 
1660: 20 42 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65   Bitvec *pInSave
1670: 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  point;        /*
1680: 20 53 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e   Set of pages in
1690: 20 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20   this savepoint 
16a0: 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b  */.  Pgno nOrig;
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75    /* Original nu
16d0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
16e0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
16f0: 69 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  iSubRec;        
1700: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1710: 20 6f 66 20 66 69 72 73 74 20 72 65 63 6f 72 64   of first record
1720: 20 69 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   in sub-journal 
1730: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f  */.};../*.** A o
1740: 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69  pen page cache i
1750: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1760: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1770: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
1780: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61  Pager.errCode ma
1790: 79 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  y be set to SQLI
17a0: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
17b0: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20  _CORRUPT, or.** 
17c0: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20  or SQLITE_FULL. 
17d0: 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  Once one of the 
17e0: 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f  first three erro
17f0: 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65  rs occurs, it pe
1800: 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73  rsists.** and is
1810: 20 72 65 74 75 72 6e 65 64 20 61 73 20 74 68 65   returned as the
1820: 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79   result of every
1830: 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49   major pager API
1840: 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53   call.  The.** S
1850: 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72  QLITE_FULL retur
1860: 6e 20 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74  n code is slight
1870: 6c 79 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74  ly different. It
1880: 20 70 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75   persists only u
1890: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74  ntil the.** next
18a0: 20 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c   successful roll
18b0: 62 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65  back is performe
18c0: 64 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63  d on the pager c
18d0: 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53  ache. Also,.** S
18e0: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
18f0: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
1900: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1910: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
1920: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49  rLookup().** API
1930: 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c  s, they may stil
1940: 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65 73  l be used succes
1950: 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4d 61  sfully..**.** Ma
1960: 6e 61 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20  naging the size 
1970: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1980: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 69 73  file in pages is
1990: 20 61 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69   a little compli
19a0: 63 61 74 65 64 2e 0a 2a 2a 20 54 68 65 20 76 61  cated..** The va
19b0: 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53  riable Pager.dbS
19c0: 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ize contains the
19d0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
19e0: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
19f0: 73 65 0a 2a 2a 20 69 6d 61 67 65 20 63 75 72 72  se.** image curr
1a00: 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 2e 20  ently contains. 
1a10: 41 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  As the database 
1a20: 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72 20 73  image grows or s
1a30: 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a 20 76  hrinks this.** v
1a40: 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61 74  ariable is updat
1a50: 65 64 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  ed. The variable
1a60: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
1a70: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
1a80: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 70 61 67 65  umber.** of page
1a90: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1aa0: 65 20 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79  e file. This may
1ab0: 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72   be different fr
1ac0: 6f 6d 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a  om Pager.dbSize.
1ad0: 2a 2a 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73  ** if some pages
1ae0: 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e   have been appen
1af0: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ded to the datab
1b00: 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f  ase image but no
1b10: 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a  t yet written.**
1b20: 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63 61   out from the ca
1b30: 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75 61  che to the actua
1b40: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  l file on disk. 
1b50: 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65 20  Or if the image 
1b60: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 74 72 75 6e  has been.** trun
1b70: 63 61 74 65 64 20 62 79 20 61 6e 20 69 6e 63 72  cated by an incr
1b80: 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 20 6f  emental-vacuum o
1b90: 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 50 61  peration. The Pa
1ba0: 67 65 72 2e 64 62 4f 72 69 67 53 69 7a 65 20 76  ger.dbOrigSize v
1bb0: 61 72 69 61 62 6c 65 0a 2a 2a 20 63 6f 6e 74 61  ariable.** conta
1bc0: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
1bd0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1be0: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 68  atabase image wh
1bf0: 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  en the current.*
1c00: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
1c10: 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f  s opened. The co
1c20: 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68  ntents of all th
1c30: 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 72  ree of these var
1c40: 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20 6f 6e 6c  iables is.** onl
1c50: 79 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  y guaranteed to 
1c60: 62 65 20 63 6f 72 72 65 63 74 20 69 66 20 74 68  be correct if th
1c70: 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65 72 2e  e boolean Pager.
1c80: 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73 20 74  dbSizeValid is t
1c90: 72 75 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  rue..*/.struct P
1ca0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
1cb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
1cc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
1cd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
1ce0: 49 4f 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  IO */.  u8 journ
1cf0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
1d00: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
1d10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
1d20: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
1d30: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
1d40: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
1d50: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
1d60: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
1d70: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
1d80: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
1d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1da0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
1db0: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
1dc0: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
1dd0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
1de0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
1df0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
1e00: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 6e  dlocks */.  u8 n
1e10: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
1e20: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1e30: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
1e40: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
1e50: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1e70: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
1e80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
1e90: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
1ea0: 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73 3b 20   u8 sync_flags; 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec0: 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d  One of SYNC_NORM
1ed0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
1ee0: 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20  */.  u8 state;  
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   /* PAGER_UNLOCK
1f10: 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45  , _SHARED, _RESE
1f20: 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20  RVED, etc. */.  
1f30: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1f50: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
1f60: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
1f70: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f90: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
1fa0: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
1fb0: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73  /* True if an fs
1fe0: 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20  ync() is needed 
1ff0: 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  on the journal *
2000: 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68  /.  u8 dirtyCach
2010: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2020: 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
2030: 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61  d pages have cha
2040: 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77  nged */.  u8 alw
2050: 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20  aysRollback;    
2060: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2070: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2080: 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f  for all pages */
2090: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20b0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
20c0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
20d0: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
20e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20f0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
2100: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
2110: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
2120: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
2130: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2140: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
2150: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
2160: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
2170: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
2180: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
2190: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
21a0: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
21b0: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
21c0: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21e0: 4f 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f  On of the PAGER_
21f0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61  JOURNALMODE_* va
2200: 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 64 62 4d  lues */.  u8 dbM
2210: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
2220: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2230: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
2240: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
2250: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
2260: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
2270: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
2280: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2290: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
22a0: 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c  /.  u8 dbSizeVal
22b0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
22c0: 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69  /* Set when dbSi
22d0: 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f  ze is correct */
22e0: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2300: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
2310: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
2320: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
2330: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
2340: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
2350: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
2370: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
2380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2390: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
23a0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
23b0: 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 76 66  file */.  u32 vf
23c0: 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
23d0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
23e0: 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  or sqlite3_vfs.x
23f0: 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  Open() */.  int 
2400: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
2410: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2420: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
2430: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
2440: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
2450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2460: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
2470: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
2480: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
2490: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
24a0: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
24b0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
24c0: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
24d0: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
24e0: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
24f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2500: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
2510: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
2520: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2540: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
2550: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
2560: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
2570: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2590: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
25a0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  in a page */.  i
25b0: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
25c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
25d0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
25e0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f  -memory pages */
25f0: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2610: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
2620: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
2630: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
2640: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
2650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2660: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
2670: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2680: 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ase */.  Bitvec 
2690: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
26a0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
26b0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
26c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26d0: 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  le */.  Bitvec *
26e0: 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b  pAlwaysRollback;
26f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
2700: 6f 72 20 65 61 63 68 20 70 61 67 65 20 6d 61 72  or each page mar
2710: 6b 65 64 20 61 6c 77 61 79 73 2d 72 6f 6c 6c 62  ked always-rollb
2720: 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ack */.  char *z
2730: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
2740: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2750: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2760: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
2770: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2780: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2790: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
27a0: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63  /.  char *zDirec
27b0: 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  tory;           
27c0: 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c  /* Directory hol
27d0: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  d database and j
27e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
27f0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2800: 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a  fd, *jfd;     /*
2810: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
2820: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
2830: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
2840: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
2850: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
2860: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
2870: 6f 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  or the sub-journ
2880: 61 6c 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  al*/.  int (*xBu
2890: 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a  syHandler)(void*
28a0: 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ); /* Function t
28b0: 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79  o call when busy
28c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
28d0: 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20  yHandlerArg;    
28e0: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67    /* Context arg
28f0: 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48  ument for xBusyH
2900: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 36 34 20  andler */.  i64 
2910: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
2920: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2930: 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 69  nt byte offset i
2940: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2950: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
2960: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
2970: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
2980: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
2990: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
29a0: 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a  .  u32 sectorSiz
29b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
29c0: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
29d0: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
29e0: 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20  lback */.#ifdef 
29f0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
2a00: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
2a10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
2a20: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
2a30: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
2a40: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
2a50: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2a60: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
2a70: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
2a80: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
2a90: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
2aa0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
2ab0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
2ac0: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
2ad0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
2ae0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
2af0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
2b00: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
2b10: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
2b20: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
2b30: 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20  oid *pCodecArg; 
2b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2b50: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
2b60: 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64  xCodec() */.#end
2b70: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
2b80: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
2b90: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
2ba0: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
2bb0: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
2bc0: 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65  .  char dbFileVe
2bd0: 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f  rs[16];        /
2be0: 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76  * Changes whenev
2bf0: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
2c00: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 69 36   changes */.  i6
2c10: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
2c20: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
2c30: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
2c40: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
2c50: 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65  iles */.  PCache
2c60: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
2c70: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2c80: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
2c90: 62 6a 65 63 74 20 2a 2f 0a 20 20 50 61 67 65 72  bject */.  Pager
2ca0: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
2cb0: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
2cc0: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
2cd0: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
2ce0: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
2cf0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d00: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
2d10: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 7d  Savepoint[] */.}
2d20: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
2d30: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
2d40: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
2d50: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
2d60: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
2d70: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
2d80: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
2d90: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
2da0: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
2db0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
2dc0: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
2dd0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
2de0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
2df0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
2e00: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
2e10: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
2e20: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
2e30: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
2e40: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
2e50: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
2e60: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
2e70: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
2e80: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
2e90: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
2ea0: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
2eb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ec0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
2ed0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
2ee0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
2ef0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
2f00: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
2f10: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
2f20: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
2f30: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
2f40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
2f50: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
2f60: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
2f70: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
2f80: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
2f90: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
2fa0: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
2fb0: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
2fc0: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
2fd0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
2fe0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
2ff0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
3000: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
3010: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
3020: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
3030: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
3040: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
3050: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
3060: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
3070: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
3080: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
3090: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
30a0: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
30b0: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
30c0: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
30d0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
30e0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
30f0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
3100: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
3110: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
3120: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
3130: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
3140: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
3150: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
3160: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
3170: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
3180: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
3190: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
31a0: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
31b0: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
31c0: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
31d0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
31e0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
31f0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
3200: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
3210: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
3220: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
3230: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
3240: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
3250: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
3260: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
3270: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
3280: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
3290: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
32a0: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
32b0: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
32c0: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
32d0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
32e0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
32f0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
3300: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
3310: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
3320: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
3330: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
3340: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
3350: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
3360: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
3370: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
3380: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
3390: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
33a0: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
33b0: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
33c0: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
33d0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
33e0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
33f0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
3400: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
3410: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
3420: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
3430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
3440: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
3450: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
3460: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
3470: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
3480: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
3490: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
34a0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
34b0: 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61  header and of ea
34c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  ch page in the j
34d0: 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d  ournal is determ
34e0: 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66  ined.** by the f
34f0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e  ollowing macros.
3500: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
3510: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
3520: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
3530: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
3540: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
3550: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
3560: 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68  his pager. In th
3570: 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63  e future, this c
3580: 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74  ould be.** set t
3590: 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61  o some value rea
35a0: 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  d from the disk 
35b0: 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20  controller. The 
35c0: 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61  important.** cha
35d0: 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74  racteristic is t
35e0: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61  hat it is the sa
35f0: 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73  me size as a dis
3600: 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65  k sector..*/.#de
3610: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
3620: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
3630: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
3640: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
3650: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
3660: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
3670: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
3680: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
3690: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
36a0: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
36b0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
36c0: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
36d0: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
36e0: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
36f0: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
3700: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
3710: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
3720: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
3730: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
3740: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
3750: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
3760: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
3770: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
3780: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
3790: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
37a0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d  ../*.** Page num
37b0: 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ber PAGER_MJ_PGN
37c0: 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  O is never used 
37d0: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
37e0: 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20  abase (it is.** 
37f0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72  reserved for wor
3800: 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69  king around a wi
3810: 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f  ndows/posix inco
3820: 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74  mpatibility). It
3830: 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74   is.** used in t
3840: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69  he journal to si
3850: 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72  gnify that the r
3860: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
3870: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
3880: 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73   is devoted to s
3890: 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20  toring a master 
38a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74  journal name - t
38b0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
38c0: 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c   pages to.** rol
38d0: 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d  l back. See comm
38e0: 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f  ents for functio
38f0: 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  n writeMasterJou
3900: 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69  rnal() for detai
3910: 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e  ls..*/./* #defin
3920: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
3930: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
3940: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
3950: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ) */.#define PAG
3960: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28  ER_MJ_PGNO(x) ((
3970: 50 67 6e 6f 29 28 28 50 45 4e 44 49 4e 47 5f 42  Pgno)((PENDING_B
3980: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
3990: 7a 65 29 29 2b 31 29 29 0a 0a 2f 2a 0a 2a 2a 20  ze))+1))../*.** 
39a0: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  The maximum lega
39b0: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  l page number is
39c0: 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a   (2^31 - 1)..*/.
39d0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41  #define PAGER_MA
39e0: 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34  X_PGNO 214748364
39f0: 37 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  7../*.** Return 
3a00: 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65  true if it is ne
3a10: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
3a20: 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20   page *pPg into 
3a30: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
3a40: 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73  .** A page needs
3a50: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
3a60: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
3a70: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69  nal if there exi
3a80: 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f  sts one.** or mo
3a90: 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  re open savepoin
3aa0: 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a  ts for which:.**
3ab0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
3ac0: 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20  -number is less 
3ad0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
3ae0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
3af0: 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20  nOrig, and.**   
3b00: 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73  * The bit corres
3b10: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
3b20: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f  age-number is no
3b30: 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20  t set in.**     
3b40: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
3b50: 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  InSavepoint..*/.
3b60: 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52  static int subjR
3b70: 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64  equiresPage(PgHd
3b80: 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20  r *pPg){.  Pgno 
3b90: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
3ba0: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
3bb0: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
3bc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
3bd0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
3be0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
3bf0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
3c00: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
3c10: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
3c20: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
3c30: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
3c40: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
3c50: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
3c60: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
3c70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
3c80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3ca0: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
3cb0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
3cc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
3cd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
3ce0: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
3cf0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
3d00: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
3d10: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
3d20: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
3d30: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
3d40: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
3d50: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
3d60: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
3d70: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
3d80: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
3d90: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
3da0: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
3db0: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
3dc0: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
3dd0: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
3de0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
3df0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
3e00: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
3e10: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
3e20: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
3e30: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
3e40: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
3e50: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
3e60: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
3e70: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
3e80: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
3e90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
3ea0: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
3eb0: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
3ec0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3ed0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
3ee0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
3ef0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
3f00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3f10: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
3f20: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
3f30: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
3f40: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
3f50: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
3f60: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
3f70: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
3f80: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
3f90: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
3fa0: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
3fb0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
3fc0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
3fd0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
3fe0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
3ff0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4000: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4010: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
4020: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
4030: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
4040: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
4050: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4060: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4070: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4080: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4090: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
40a0: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  et);.}../*.** If
40b0: 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65   file pFd is ope
40c0: 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f  n, call sqlite3O
40d0: 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e  sUnlock() on it.
40e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
40f0: 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  sUnlock(sqlite3_
4100: 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65  file *pFd, int e
4110: 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46  Lock){.  if( !pF
4120: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
4130: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4140: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
4150: 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  n sqlite3OsUnloc
4160: 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d  k(pFd, eLock);.}
4170: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
4180: 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
4190: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
41a0: 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
41b0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a   optimization.**
41c0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
41d0: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
41e0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
41f0: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
4200: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
4210: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
4220: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
4230: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
4240: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
4250: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
4260: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
4270: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
4280: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
4290: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
42a0: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
42b0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
42c0: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
42d0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
42e0: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
42f0: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
4300: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
4310: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
4320: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
4330: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
4340: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
4350: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
4360: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
4370: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
4380: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
4390: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
43a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
43b0: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
43c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
43d0: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
43e0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
43f0: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f   dc;           /
4400: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
4410: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e  eristics */.  in
4420: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
4430: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
4440: 2f 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20  /.  int szPage; 
4450: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73         /* Page s
4460: 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ize */.  sqlite3
4470: 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67  _file *fd = pPag
4480: 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66  er->fd;..  if( f
4490: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
44a0: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
44b0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
44c0: 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20  istics(fd);.    
44d0: 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65  nSector = sqlite
44e0: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64  3OsSectorSize(fd
44f0: 29 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  );.    szPage = 
4500: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
4510: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
4520: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
4530: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
4540: 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  );.  assert(SQLI
4550: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
4560: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
4570: 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65  ..  if( !fd->pMe
4580: 74 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20 20  thods || .      
4590: 20 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f 49   (dc & (SQLITE_I
45a0: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
45b0: 61 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65 63  age>>8)) && nSec
45c0: 74 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b 0a  tor<=szPage) ){.
45d0: 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e      return JOURN
45e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
45f0: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
4600: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
4610: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
4620: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
4630: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
4640: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
4650: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
4660: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a  ithin the pager.
4670: 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72  ** code. The fir
4680: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
4690: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
46a0: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
46b0: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74   the.** second t
46c0: 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
46d0: 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
46e0: 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
46f0: 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20  I function. .** 
4700: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
4710: 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
4720: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4730: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
4740: 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
4750: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
4760: 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f  ent is SQLITE_IO
4770: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
4780: 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46  UPT, or SQLITE_F
4790: 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ULL.** the error
47a0: 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74   becomes persist
47b0: 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70  ent. Until the p
47c0: 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69  ersisten error i
47d0: 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75  s cleared,.** su
47e0: 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c  bsequent API cal
47f0: 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72  ls on this Pager
4800: 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
4810: 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  y return the sam
4820: 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  e .** error code
4830: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73  ..**.** A persis
4840: 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63  tent error indic
4850: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
4860: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
4870: 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61  ger-cache .** ca
4880: 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
4890: 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20   This state can 
48a0: 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f  be cleared by co
48b0: 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64  mpletely discard
48c0: 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ing .** the cont
48d0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
48e0: 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72  r-cache. If a tr
48f0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63  ansaction was ac
4900: 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tive when.** the
4910: 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
4920: 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20  r occured, then 
4930: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
4940: 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
4950: 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e   to be replayed.
4960: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4970: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
4980: 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61  er *pPager);.sta
4990: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
49a0: 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
49b0: 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
49c0: 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
49d0: 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20  f;.  assert(.   
49e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
49f0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
4a00: 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65   ||.       pPage
4a10: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
4a20: 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20  TE_OK ||.       
4a30: 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
4a40: 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45   & 0xff)==SQLITE
4a50: 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66  _IOERR.  );.  if
4a60: 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  (.    rc2==SQLIT
4a70: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63  E_FULL ||.    rc
4a80: 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  2==SQLITE_IOERR 
4a90: 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ||.    rc2==SQLI
4aa0: 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a  TE_CORRUPT.  ){.
4ab0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
4ac0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66  ode = rc;.    if
4ad0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
4ae0: 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20  =PAGER_UNLOCK . 
4af0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63      && sqlite3Pc
4b00: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
4b10: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
4b20: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
4b30: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
4b40: 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b  s already unlock
4b50: 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75  ed, call pager_u
4b60: 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20  nlock() now to. 
4b70: 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68       ** clear th
4b80: 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e  e error state an
4b90: 64 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  d ensure that th
4ba0: 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 69 73  e pager-cache is
4bb0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c   .      ** compl
4bc0: 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20  etely empty..   
4bd0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65     */.      page
4be0: 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
4bf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4c00: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4c10: 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43  * If SQLITE_CHEC
4c20: 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e  K_PAGES is defin
4c30: 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f  ed then we do so
4c40: 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  me sanity checki
4c50: 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63  ng.** on the cac
4c60: 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20  he using a hash 
4c70: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
4c80: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
4c90: 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67  ing.** and debug
4ca0: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  ging only..*/.#i
4cb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
4cc0: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
4cd0: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
4ce0: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
4cf0: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
4d00: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
4d10: 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20  er_datahash(int 
4d20: 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20  nByte, unsigned 
4d30: 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20  char *pData){.  
4d40: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
4d50: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4d60: 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b  ; i<nByte; i++){
4d70: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
4d80: 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b  h*1039) + pData[
4d90: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
4da0: 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20   hash;.}.static 
4db0: 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61  u32 pager_pageha
4dc0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
4dd0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  {.  return pager
4de0: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d  _datahash(pPage-
4df0: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
4e00: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
4e10: 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61  r *)pPage->pData
4e20: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
4e30: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
4e40: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
4e50: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65  ){.  pPage->page
4e60: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
4e70: 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a  ehash(pPage);.}.
4e80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
4e90: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
4ea0: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
4eb0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
4ec0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
4ed0: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
4ee0: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
4ef0: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
4f00: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
4f10: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
4f20: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
4f30: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
4f40: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
4f50: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
4f60: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
4f70: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
4f80: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
4f90: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
4fa0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
4fb0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
4fc0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
4fd0: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
4fe0: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
4ff0: 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c 7c  errCode.      ||
5000: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
5010: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
5020: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
5030: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
5040: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
5050: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
5060: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
5070: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
5080: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
5090: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
50a0: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
50b0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
50c0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
50d0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
50e0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
50f0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
5100: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65   be open..** The
5110: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5120: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61  file name is rea
5130: 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  d from the end o
5140: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a  f the file and .
5150: 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
5160: 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20  memory supplied 
5170: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 0a  by the caller. .
5180: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
5190: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
51a0: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
51b0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
51c0: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
51d0: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
51e0: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
51f0: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
5200: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
5210: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
5220: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
5230: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
5240: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
5250: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
5260: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
5270: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
5280: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
5290: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
52a0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
52b0: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
52c0: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
52d0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
52e0: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
52f0: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
5300: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
5310: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
5320: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
5330: 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b 30  resent zMaster[0
5340: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
5350: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
5360: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
5370: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
5380: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
5390: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
53a0: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
53b0: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
53c0: 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a   rc;.  u32 len;.
53d0: 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32    i64 szJ;.  u32
53e0: 20 63 6b 73 75 6d 3b 0a 20 20 75 33 32 20 75 3b   cksum;.  u32 u;
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5400: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
5410: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
5420: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
5430: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
5440: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
5450: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
5460: 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20  /..  zMaster[0] 
5470: 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d 20  = '\0';..  rc = 
5480: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
5490: 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a  e(pJrnl, &szJ);.
54a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
54b0: 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20  _OK || szJ<16 ) 
54c0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
54d0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
54e0: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
54f0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5500: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5510: 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e 3e   rc;..  if( len>
5520: 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  =nMaster ){.    
5530: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5540: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
5550: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
5560: 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b  szJ-12, &cksum);
5570: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5580: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
5590: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
55a0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61  3OsRead(pJrnl, a
55b0: 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29  Magic, 8, szJ-8)
55c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
55d0: 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28  TE_OK || memcmp(
55e0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
55f0: 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75  Magic, 8) ) retu
5600: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5610: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
5620: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
5630: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20  , szJ-16-len);. 
5640: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5650: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
5660: 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74   rc;.  }.  zMast
5670: 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  er[len] = '\0';.
5680: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
5690: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
56a0: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
56b0: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
56c0: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
56d0: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
56e0: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
56f0: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
5700: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
5710: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
5720: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
5730: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
5740: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
5750: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
5760: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
5770: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
5780: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
5790: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
57a0: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
57b0: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
57c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
57d0: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
57e0: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
57f0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
5800: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
5810: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  [0] = '\0';.  }.
5820: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
5830: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5840: 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61   Seek the journa
5850: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
5860: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  r to the next se
5870: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68  ctor boundary wh
5880: 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ere a.** journal
5890: 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72   header may be r
58a0: 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
58b0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
58c0: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
58d0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b  .** the new seek
58e0: 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69   offset..**.** i
58f0: 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20  .e for a sector 
5900: 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a  size of 512:.**.
5910: 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20  ** Input Offset 
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74               Out
5930: 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d  put Offset.** --
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5960: 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20  -----.** 0      
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5980: 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20     0.** 512     
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20    512.** 100    
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59c0: 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20     512.** 2000  
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
59f0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 65 6b  static void seek
5a00: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
5a10: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
5a20: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
5a30: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
5a40: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
5a50: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
5a60: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
5a70: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5a80: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
5a90: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
5aa0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
5ab0: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
5ac0: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
5ad0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
5ae0: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
5af0: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
5b00: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5b10: 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72  ger) );.  pPager
5b20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f  ->journalOff = o
5b30: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
5b40: 57 72 69 74 65 20 7a 65 72 6f 73 20 6f 76 65 72  Write zeros over
5b50: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
5b60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
5b70: 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a 2a    This has the.*
5b80: 2a 20 65 66 66 65 63 74 20 6f 66 20 69 6e 76 61  * effect of inva
5b90: 6c 69 64 61 74 69 6e 67 20 74 68 65 20 6a 6f 75  lidating the jou
5ba0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 63 6f  rnal file and co
5bb0: 6d 6d 69 74 74 69 6e 67 20 74 68 65 0a 2a 2a 20  mmitting the.** 
5bc0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
5bd0: 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a  static int zeroJ
5be0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
5bf0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54  *pPager, int doT
5c00: 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20  runcate){.  int 
5c10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5c20: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
5c30: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
5c40: 3d 20 7b 30 7d 3b 0a 0a 20 20 69 66 28 20 70 50  = {0};..  if( pP
5c50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5c60: 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d   ){.    i64 iLim
5c70: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  it = pPager->jou
5c80: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 0a  rnalSizeLimit;..
5c90: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
5ca0: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
5cb0: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
5cc0: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
5cd0: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
5ce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
5cf0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
5d00: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
5d10: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
5d20: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
5d30: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
5d40: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
5d50: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
5d60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5d70: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
5d80: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
5d90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
5da0: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
5db0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
5dc0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
5dd0: 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
5de0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
5df0: 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61  point the transa
5e00: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
5e10: 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65  ed but the write
5e20: 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73   lock .    ** is
5e30: 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
5e40: 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
5e50: 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69  e is a size limi
5e60: 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  t configured for
5e70: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72   .    ** the per
5e80: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
5e90: 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
5ea0: 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63  file currently c
5eb0: 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20  onsumes more.   
5ec0: 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74   ** space than t
5ed0: 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73  hat limit allows
5ee0: 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69   for, truncate i
5ef0: 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20  t now. There is 
5f00: 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  no need.    ** t
5f10: 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20  o sync the file 
5f20: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
5f30: 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
5f40: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5f50: 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74  ITE_OK && iLimit
5f60: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  >0 ){.      i64 
5f70: 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  sz;.      rc = s
5f80: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
5f90: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
5fa0: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  z);.      if( rc
5fb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
5fc0: 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  z>iLimit ){.    
5fd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5fe0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
5ff0: 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b  r->jfd, iLimit);
6000: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6020: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
6030: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
6040: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
6050: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6060: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ed. A journal.**
6070: 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c   header (JOURNAL
6080: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
6090: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
60a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
60b0: 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  at the.** curren
60c0: 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t location..**.*
60d0: 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72  * The format for
60e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
60f0: 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  der is as follow
6100: 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a  s:.** - 8 bytes:
6110: 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69   Magic identifyi
6120: 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ng journal forma
6130: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
6140: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
6150: 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f  ds in journal, o
6160: 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  r -1 no-sync mod
6170: 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20  e is on..** - 4 
6180: 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75  bytes: Random nu
6190: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61  mber used for pa
61a0: 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20  ge hash..** - 4 
61b0: 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64  bytes: Initial d
61c0: 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
61d0: 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  nt..** - 4 bytes
61e0: 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73  : Sector size us
61f0: 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73  ed by the proces
6200: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69  s that wrote thi
6210: 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20  s journal..** - 
6220: 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73  4 bytes: Databas
6230: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
6240: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
6250: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6260: 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75  - 28) bytes of u
6270: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
6280: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
6290: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
62a0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
62b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
62c0: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
62d0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
62e0: 70 61 63 65 3b 0a 20 20 75 33 32 20 6e 48 65 61  pace;.  u32 nHea
62f0: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  der = pPager->pa
6300: 67 65 53 69 7a 65 3b 0a 20 20 75 33 32 20 6e 57  geSize;.  u32 nW
6310: 72 69 74 65 3b 0a 20 20 69 6e 74 20 69 69 3b 0a  rite;.  int ii;.
6320: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
6330: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6340: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
6350: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
6360: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
6370: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
6380: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
6390: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
63a0: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
63b0: 61 74 65 64 20 73 69 6e 63 65 20 74 68 65 0a 20  ated since the. 
63c0: 20 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20   ** most recent 
63d0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
63e0: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
63f0: 74 65 20 74 68 65 20 50 61 67 65 72 53 61 76 65  te the PagerSave
6400: 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 0a 20 20  point.iHdrOff.  
6410: 2a 2a 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20  ** fields now.. 
6420: 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
6430: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
6440: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
6450: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53    if( pPager->aS
6460: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
6470: 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20  rOffset==0 ){.  
6480: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
6490: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
64a0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
64b0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
64c0: 7d 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75  }.  }..  seekJou
64d0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
64e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
64f0: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
6500: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d  journalOff;..  m
6510: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
6520: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
6530: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6540: 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ic));..  /* .  *
6550: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
6560: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
6570: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
6580: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
6590: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
65a0: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
65b0: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
65c0: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
65d0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
65e0: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
65f0: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
6600: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
6610: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
6620: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
6630: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
6640: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
6650: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
6660: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
6670: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
6680: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
6690: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
66a0: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
66b0: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
66c0: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
66d0: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
66e0: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
66f0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
6700: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
6710: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
6720: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
6730: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
6740: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
6750: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
6760: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
6770: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
6780: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
6790: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20  failure occured 
67a0: 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
67b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
67c0: 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63  ** file it may c
67d0: 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62  ontain some garb
67e0: 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20  age data. There 
67f0: 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  are two scenario
6800: 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69  s.  ** where thi
6810: 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67  s risk can be ig
6820: 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nored:.  **.  **
6830: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61     * When the pa
6840: 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ger is in no-syn
6850: 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69  c mode. Corrupti
6860: 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a  on can follow a.
6870: 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66    **     power f
6880: 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63  ailure in this c
6890: 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a  ase anyway..  **
68a0: 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74  .  **   * When t
68b0: 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  he SQLITE_IOCAP_
68c0: 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67  SAFE_APPEND flag
68d0: 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75   is set. This gu
68e0: 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20  arantees.  **   
68f0: 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64    that garbage d
6900: 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70  ata is never app
6910: 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  ended to the jou
6920: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  rnal file..  */.
6930: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
6940: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
6950: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a  Pager->noSync);.
6960: 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e    if( (pPager->n
6970: 6f 53 79 6e 63 29 20 7c 7c 20 28 70 50 61 67 65  oSync) || (pPage
6980: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
6990: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
69a0: 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20  E_MEMORY).   || 
69b0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
69c0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
69d0: 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
69e0: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
69f0: 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20  PEND) .  ){.    
6a00: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6a10: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6a20: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
6a30: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
6a40: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
6a50: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6a60: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
6a70: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  0);.  }..  /* Th
6a80: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
6a90: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
6aa0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
6ab0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
6ac0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6ad0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
6ae0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
6af0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
6b00: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6b10: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
6b20: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
6b30: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
6b40: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
6b50: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6b60: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6b70: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
6b80: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
6b90: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
6ba0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
6bb0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
6bc0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
6bd0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6be0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
6bf0: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
6c00: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  rSize);..  /* In
6c10: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
6c20: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
6c30: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
6c40: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
6c50: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
6c60: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
6c70: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
6c80: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
6c90: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
6ca0: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
6cb0: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
6cc0: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
6cd0: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
6ce0: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
6cf0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
6d00: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
6d10: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6d20: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
6d30: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
6d40: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
6d50: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 29  ournalMagic)+16)
6d60: 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
6d70: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20  ->journalHdr==0 
6d80: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
6d90: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70  ge size */.    p
6da0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6db0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6dc0: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
6dd0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
6de0: 20 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74    }..  for(nWrit
6df0: 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e=0; rc==SQLITE_
6e00: 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e  OK&&nWrite<JOURN
6e10: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6e20: 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64  ); nWrite+=nHead
6e30: 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  er){.    IOTRACE
6e40: 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
6e50: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
6e60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
6e70: 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20  r, nHeader)).   
6e80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
6e90: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
6ea0: 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64  , zHeader, nHead
6eb0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
6ec0: 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61  nalOff);.    pPa
6ed0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
6ee0: 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a  += nHeader;.  }.
6ef0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6f00: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
6f10: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
6f20: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
6f30: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
6f40: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
6f50: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
6f60: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
6f70: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
6f80: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
6f90: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
6fa0: 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  le. See comments
6fb0: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
6fc0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
6fd0: 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  ) for a descript
6fe0: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f  ion of.** the jo
6ff0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
7000: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
7010: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
7020: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
7030: 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  nRec is set to t
7040: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
7050: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
7060: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
7070: 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69  er and *dbSize i
7080: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
7090: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
70a0: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
70b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
70c0: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
70d0: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
70e0: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
70f0: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
7100: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
7110: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
7120: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
7130: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
7140: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
7150: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
7160: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
7170: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
7180: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
7190: 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20  urned and *nRec 
71a0: 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20  and *dbSize are 
71b0: 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55  not set.  If JOU
71c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
71d0: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
71e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
71f0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
7200: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
7210: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
7220: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
7230: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
7240: 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e  er, .  i64 journ
7250: 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70  alSize,.  u32 *p
7260: 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44  NRec, .  u32 *pD
7270: 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72  bSize.){.  int r
7280: 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
7290: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
72a0: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
72b0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
72c0: 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  er */.  i64 jrnl
72d0: 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67 65  Off;.  int iPage
72e0: 53 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75  Size;..  seekJou
72f0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
7300: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
7310: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
7320: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7330: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
7340: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7350: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
7360: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
7370: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
7380: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
7390: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
73a0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
73b0: 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66  aMagic), jrnlOff
73c0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
73d0: 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f  turn rc;.  jrnlO
73e0: 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61  ff += sizeof(aMa
73f0: 67 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  gic);..  if( mem
7400: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
7410: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
7420: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
7430: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7440: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
7450: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7460: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
7470: 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20  lOff, pNRec);.  
7480: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
7490: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
74a0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
74b0: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26  fd, jrnlOff+4, &
74c0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
74d0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
74e0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
74f0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
7500: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
7510: 66 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  f+8, pDbSize);. 
7520: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7530: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
7540: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
7550: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c  jfd, jrnlOff+16,
7560: 20 28 75 33 32 20 2a 29 26 69 50 61 67 65 53 69   (u32 *)&iPageSi
7570: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ze);.  if( rc==S
7580: 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
7590: 69 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a  iPageSize>=512 .
75a0: 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65 3c     && iPageSize<
75b0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
75c0: 5f 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28 69  _SIZE .   && ((i
75d0: 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
75e0: 65 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a  eSize)==0 .  ){.
75f0: 20 20 20 20 75 31 36 20 70 61 67 65 73 69 7a 65      u16 pagesize
7600: 20 3d 20 28 75 31 36 29 69 50 61 67 65 53 69 7a   = (u16)iPageSiz
7610: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
7620: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
7630: 69 7a 65 28 70 50 61 67 65 72 2c 20 26 70 61 67  ize(pPager, &pag
7640: 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66  esize);.  }.  if
7650: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
7660: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
7670: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
7680: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
7690: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
76a0: 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  y .  ** the proc
76b0: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
76c0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
76d0: 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
76e0: 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  as.  ** created 
76f0: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
7700: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
7710: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
7720: 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ine.  ** is bein
7730: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
7740: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
7750: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
7760: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50   value.  ** of P
7770: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
7780: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
7790: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
77a0: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72  outine..  */.  r
77b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
77c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
77d0: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
77e0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
77f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
7800: 72 63 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65  rc;.  if( (pPage
7810: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 26 20  r->sectorSize & 
7820: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
7830: 69 7a 65 2d 31 29 29 21 3d 30 0a 20 20 20 20 20  ize-1))!=0.     
7840: 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73      || pPager->s
7850: 65 63 74 6f 72 53 69 7a 65 3e 30 78 31 30 30 30  ectorSize>0x1000
7860: 30 30 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  000 ){.    retur
7870: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
7880: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
7890: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
78a0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
78b0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
78c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
78d0: 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
78e0: 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
78f0: 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
7900: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
7910: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
7920: 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
7930: 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
7940: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7950: 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
7960: 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
7970: 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
7980: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
7990: 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
79a0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
79b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
79c0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
79d0: 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
79e0: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
79f0: 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
7a00: 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
7a10: 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
7a20: 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  .**.** + 4 bytes
7a30: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
7a40: 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c  .** + N bytes: l
7a50: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
7a60: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
7a70: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a   + 4 bytes: N.**
7a80: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
7a90: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
7aa0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38  checksum..** + 8
7ab0: 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
7ac0: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
7ad0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7ae0: 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
7af0: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
7b00: 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
7b10: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
7b20: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
7b30: 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
7b40: 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
7b50: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
7b60: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
7b70: 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
7b80: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
7b90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
7ba0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
7bb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
7bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
7bd0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
7be0: 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e    int len; .  in
7bf0: 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c  t i; .  i64 jrnl
7c00: 4f 66 66 3b 0a 20 20 69 36 34 20 6a 72 6e 6c 53  Off;.  i64 jrnlS
7c10: 69 7a 65 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ize;.  u32 cksum
7c20: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
7c30: 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  f[sizeof(aJourna
7c40: 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20  lMagic)+2*4];.. 
7c50: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c   if( !zMaster ||
7c60: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
7c70: 65 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  er ) return SQLI
7c80: 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
7c90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
7ca0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
7cb0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 20 72 65 74  ODE_MEMORY ) ret
7cc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
7cd0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
7ce0: 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d  er = 1;..  len =
7cf0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7d00: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72  (zMaster);.  for
7d10: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
7d20: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
7d30: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
7d40: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
7d50: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
7d60: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
7d70: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
7d80: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
7d90: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
7da0: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
7db0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
7dc0: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
7dd0: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
7de0: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
7df0: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
7e00: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
7e10: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
7e20: 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64     seekJournalHd
7e30: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  r(pPager);.  }. 
7e40: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
7e50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
7e60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7e70: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
7e80: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
7e90: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
7ea0: 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52  , jrnlOff, PAGER
7eb0: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
7ec0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7ed0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7ee0: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
7ef0: 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   4;..  rc = sqli
7f00: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
7f10: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
7f20: 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a   len, jrnlOff);.
7f30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7f40: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7f50: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65  .  jrnlOff += le
7f60: 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28  n;..  put32bits(
7f70: 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75  zBuf, len);.  pu
7f80: 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d  t32bits(&zBuf[4]
7f90: 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63  , cksum);.  memc
7fa0: 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f  py(&zBuf[8], aJo
7fb0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7fc0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7fd0: 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
7fe0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
7ff0: 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73  ->jfd, zBuf, 8+s
8000: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8010: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
8020: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73    jrnlOff += 8+s
8030: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8040: 67 69 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  gic);.  pPager->
8050: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
8060: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f  er->noSync;..  /
8070: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
8080: 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
8090: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
80a0: 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
80b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
80c0: 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
80d0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
80e0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
80f0: 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
8100: 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
8110: 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
8120: 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
8130: 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
8140: 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
8150: 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
8160: 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
8170: 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
8180: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
8190: 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
81a0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
81b0: 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
81c0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
81d0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
81e0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
81f0: 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
8200: 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
8210: 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
8220: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
8230: 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
8240: 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
8250: 2a 2f 20 0a 20 20 69 66 28 20 28 72 63 3d 3d 53  */ .  if( (rc==S
8260: 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20  QLITE_OK).   && 
8270: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
8280: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
8290: 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
82a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
82b0: 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f  & jrnlSize>jrnlO
82c0: 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
82d0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
82e0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
82f0: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  jrnlOff);.  }.  
8300: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
8310: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
8320: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
8330: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
8340: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
8350: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
8360: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
8370: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
8380: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
8390: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
83a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
83b0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
83c0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 50 63   *p;.  sqlite3Pc
83d0: 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
83e0: 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
83f0: 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72   0, &p);.  retur
8400: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  n p;.}../*.** Cl
8410: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
8420: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
8430: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
8440: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
8450: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
8460: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
8470: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
8480: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
8490: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
84a0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
84b0: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
84c0: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
84d0: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
84e0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
84f0: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
8500: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8510: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
8520: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
8530: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
8540: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  e ) return;.  sq
8550: 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
8560: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
8570: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
8580: 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
8590: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
85a0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
85b0: 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
85c0: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
85d0: 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
85e0: 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
85f0: 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
8600: 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
8610: 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
8620: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
8630: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
8640: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
8650: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
8660: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8670: 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72  .  int ii;.  for
8680: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
8690: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
86a0: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
86b0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
86c0: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
86d0: 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
86e0: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  t);.  }.  if( !p
86f0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
8700: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
8710: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
8720: 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  r->sjfd);.  }.  
8730: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
8740: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29  ger->aSavepoint)
8750: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76  ;.  pPager->aSav
8760: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
8770: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
8780: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8790: 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 7d 0a  stmtNRec = 0;.}.
87a0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
87b0: 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
87c0: 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
87d0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
87e0: 74 20 62 69 74 76 65 63 73 20 6f 66 0a 2a 2a 20  t bitvecs of.** 
87f0: 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
8800: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nts..*/.static i
8810: 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e  nt addToSavepoin
8820: 74 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a  tBitvecs(Pager *
8830: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
8840: 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  o){.  int ii;   
8850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8860: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8870: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
8880: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f  LITE_OK;       /
8890: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
88a0: 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ..  for(ii=0; ii
88b0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
88c0: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
88d0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
88e0: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
88f0: 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20  vepoint[ii];.   
8900: 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f   if( pgno<=p->nO
8910: 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
8920: 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  |= sqlite3Bitvec
8930: 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  Set(p->pInSavepo
8940: 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  int, pgno);.    
8950: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
8960: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
8970: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
8980: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8990: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
89a0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
89b0: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
89c0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
89d0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72  currently in err
89e0: 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72  or state, discar
89f0: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
8a00: 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  f .** the cache 
8a10: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61  and reset the Pa
8a20: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e  ger structure in
8a30: 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66  ternal state. If
8a40: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
8a50: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c  open journal-fil
8a60: 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  e, then the next
8a70: 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c   time a shared-l
8a80: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ock is obtained.
8a90: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ** on the pager 
8aa0: 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72  file (by this or
8ab0: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
8ac0: 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ss), it will be.
8ad0: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20  ** treated as a 
8ae0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
8af0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
8b00: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
8b10: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
8b20: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
8b30: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8b40: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
8b50: 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70   rc = osUnlock(p
8b60: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
8b70: 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  CK);.    if( rc 
8b80: 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ) pPager->errCod
8b90: 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
8ba0: 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
8bb0: 3d 20 30 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  = 0;.    IOTRACE
8bc0: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
8bd0: 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f   pPager))..    /
8be0: 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74  * Always close t
8bf0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8c00: 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
8c10: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
8c20: 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
8c30: 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  e, another conne
8c40: 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
8c50: 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
8c60: 69 67 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65  ight.    ** dele
8c70: 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20  te the file out 
8c80: 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
8c90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
8ca0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
8cb0: 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
8cc0: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
8cd0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50  ->jfd);.      pP
8ce0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
8cf0: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  n = 0;.      sql
8d00: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
8d10: 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
8d20: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 70 50 61  rnal);.      pPa
8d30: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
8d40: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
8d50: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
8d60: 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
8d70: 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  ollback);.      
8d80: 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
8d90: 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  ollback = 0;.   
8da0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61   }..    /* If Pa
8db0: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
8dc0: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
8dd0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
8de0: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
8df0: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
8e00: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
8e10: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
8e20: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
8e30: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
8e40: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
8e50: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
8e60: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
8e70: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
8e80: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
8e90: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
8ea0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8eb0: 4b 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43  K ) pPager->errC
8ec0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
8ed0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
8ee0: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
8ef0: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
8f00: 70 6f 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  point(pPager);. 
8f10: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
8f20: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
8f30: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
8f40: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
8f50: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f       pPager->dbO
8f60: 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  rigSize = 0;.   
8f70: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
8f80: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
8f90: 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  LOCK;.    pPager
8fa0: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
8fb0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
8fc0: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
8fd0: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
8fe0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
8ff0: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
9000: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
9010: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
9020: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
9030: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
9040: 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74  tate, .** do not
9050: 20 61 74 74 65 6d 70 74 20 74 68 65 20 72 6f 6c   attempt the rol
9060: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
9070: 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
9080: 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
9090: 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  er *p){.  if( p-
90a0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
90b0: 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74 65 3e  _OK && p->state>
90c0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
90d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
90e0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
90f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
9100: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  gerRollback(p);.
9110: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
9120: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
9130: 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
9140: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  (p);.}../*.** Th
9150: 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
9160: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
9170: 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
9180: 20 65 6e 64 65 64 20 62 79 20 65 69 74 68 65 72   ended by either
9190: 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  .** a COMMIT or 
91a0: 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a  a ROLLBACK..**.*
91b0: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
91c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
91d0: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
91e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
91f0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45  en and.** a RESE
9200: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
9210: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
9220: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
9230: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61  utine will relea
9240: 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  se.** the databa
9250: 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75  se lock and acqu
9260: 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f  ires a SHARED lo
9270: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20  ck in its place 
9280: 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68  if that is.** th
9290: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 68  e appropriate th
92a0: 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65  ing to do.  Rele
92b0: 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c  ase locks usuall
92c0: 79 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  y is appropriate
92d0: 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61  ,.** unless we a
92e0: 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  re in exclusive 
92f0: 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75  access mode or u
9300: 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20  nless this is a 
9310: 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42  .** COMMIT AND B
9320: 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  EGIN or ROLLBACK
9330: 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61   AND BEGIN opera
9340: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
9350: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9360: 65 69 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f  either deleted o
9370: 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a  r truncated..**.
9380: 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65  ** TODO: Conside
9390: 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f  r keeping the jo
93a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
93b0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  for temporary da
93c0: 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73  tabases..** This
93d0: 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
93e0: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
93f0: 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73  ement on windows
9400: 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a   where opening.*
9410: 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65  * a file is an e
9420: 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
9430: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
9440: 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
9450: 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
9460: 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61  Pager, int hasMa
9470: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
9480: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
9490: 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
94a0: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
94b0: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
94c0: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
94d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
94e0: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c    }.  releaseAll
94f0: 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72  Savepoint(pPager
9500: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9510: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
9520: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
9530: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9540: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
9550: 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69  EMORY ){.      i
9560: 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e  nt isMemoryJourn
9570: 61 6c 20 3d 20 73 71 6c 69 74 65 33 49 73 4d 65  al = sqlite3IsMe
9580: 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
9590: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  >jfd);.      sql
95a0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
95b0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
95c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
95d0: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pen = 0;.      i
95e0: 66 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75 72  f( !isMemoryJour
95f0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nal ){.        r
9600: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
9610: 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
9620: 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
9630: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
9640: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
9650: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
9660: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9670: 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20  MODE_TRUNCATE.  
9680: 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20         && (rc = 
9690: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
96a0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
96b0: 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))==SQLITE_OK ){
96c0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
96d0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
96e0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
96f0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
9700: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
9710: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
9720: 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50  Mode .     || pP
9730: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
9740: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9750: 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
9760: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
9770: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
9780: 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
9790: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
97a0: 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
97b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
97c0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
97d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
97e0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
97f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9800: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9810: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9820: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9830: 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20 29 3b  _DELETE || rc );
9840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
9850: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
9860: 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  d);.      pPager
9870: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
9880: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  0;.      if( rc=
9890: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
98a0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
98b0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
98c0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
98d0: 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
98e0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
98f0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
9900: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  }.    sqlite3Bit
9910: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
9920: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
9930: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
9940: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
9950: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
9960: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c  troy(pPager->pAl
9970: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20  waysRollback);. 
9980: 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61     pPager->pAlwa
9990: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
99a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
99b0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73 71  ECK_PAGES.    sq
99c0: 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
99d0: 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
99e0: 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73  pPCache, pager_s
99f0: 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23 65  et_pagehash);.#e
9a00: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
9a10: 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
9a20: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
9a30: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
9a40: 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
9a50: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
9a60: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
9a70: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9a80: 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
9a90: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
9aa0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
9ab0: 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  de ){.    rc2 = 
9ac0: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
9ad0: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
9ae0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
9af0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
9b00: 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  RED;.  }else if(
9b10: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
9b20: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a  PAGER_SYNCED ){.
9b30: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
9b40: 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
9b50: 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  IVE;.  }.  pPage
9b60: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
9b70: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
9b80: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
9b90: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
9ba0: 20 30 3b 0a 20 20 2f 2a 20 6c 72 75 4c 69 73 74   0;.  /* lruList
9bb0: 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 70  SetFirstSynced(p
9bc0: 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 69 66 28  Pager); */.  if(
9bd0: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70   !MEMDB ){.    p
9be0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
9bf0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  id = 0;.  }.  pP
9c00: 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
9c10: 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
9c20: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
9c30: 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
9c40: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
9c50: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66  urn a checksum f
9c60: 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64  or the page of d
9c70: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ata..**.** This 
9c80: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
9c90: 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72  ecksum.  It is r
9ca0: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
9cb0: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
9cc0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
9cd0: 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ue and the page 
9ce0: 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65  number.  We expe
9cf0: 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a  rimented with.**
9d00: 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74   a checksum of t
9d10: 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20  he entire data, 
9d20: 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75  but that was fou
9d30: 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f  nd to be too slo
9d40: 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  w..**.** Note th
9d50: 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
9d60: 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  er is stored at 
9d70: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
9d80: 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65   data and.** the
9d90: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f   checksum is sto
9da0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  red at the end. 
9db0: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
9dc0: 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a  nt.  If journal.
9dd0: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  ** corruption oc
9de0: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
9df0: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
9e00: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65   most likely sce
9e10: 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74  nario.** is that
9e20: 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
9e30: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
9e40: 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
9e50: 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d  ged.  It is.** m
9e60: 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
9e70: 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
9e80: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
9e90: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
9ea0: 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
9eb0: 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
9ec0: 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
9ed0: 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
9ee0: 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
9ef0: 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
9f00: 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
9f10: 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
9f20: 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a  f corruption..**
9f30: 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e  .** FIX ME:  Con
9f40: 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65  sider adding eve
9f50: 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29  ry 200th (or so)
9f60: 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74   byte of the dat
9f70: 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63  a to the.** chec
9f80: 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20  ksum.  That way 
9f90: 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
9fa0: 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65   spans 3 or more
9fb0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e   disk sectors an
9fc0: 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69  d.** only the mi
9fd0: 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63  ddle sector is c
9fe0: 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20  orrupt, we will 
9ff0: 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61  still have a rea
a000: 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63  sonable.** chanc
a010: 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65  e of failing the
a020: 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68   checksum and th
a030: 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65  us detecting the
a040: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61   problem..*/.sta
a050: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
a060: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
a070: 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
a080: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
a090: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
a0a0: 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20  Init;.  int i = 
a0b0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a0c0: 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69  -200;.  while( i
a0d0: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
a0e0: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
a0f0: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
a100: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
a110: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
a120: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
a130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a140: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
a150: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
a160: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
a170: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
a180: 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c  * The isMainJrnl
a190: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
a1a0: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   this is the mai
a1b0: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
a1c0: 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20  al and.** false 
a1d0: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
a1e0: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  t journal.  The 
a1f0: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
a200: 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68  urnal uses.** ch
a210: 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
a220: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
a230: 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  does not..*/.sta
a240: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
a250: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
a260: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
a270: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a280: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
a290: 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
a2a0: 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
a2b0: 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
a2c0: 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
a2d0: 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
a2e0: 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
a2f0: 69 36 34 20 6f 66 66 73 65 74 2c 20 20 20 20 20  i64 offset,     
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a310: 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72   Offset of recor
a320: 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f  d to playback */
a330: 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74  .  int isSavepnt
a340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a350: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73   /* True for a s
a360: 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
a370: 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
a380: 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 20 20  Done            
a390: 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
a3a0: 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
a3b0: 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 29  played back */.)
a3c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
a3d0: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
a3f0: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
a400: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
a410: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
a440: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
a450: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
a460: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
a470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
a480: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
a490: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
a4a0: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  */.  u8 *aData =
a4b0: 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
a4c0: 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54  TmpSpace;   /* T
a4d0: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
a4e0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  a page */.  sqli
a4f0: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 20 3d 20  te3_file *jfd = 
a500: 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50  (isMainJrnl ? pP
a510: 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
a520: 65 72 2d 3e 73 6a 66 64 29 3b 0a 0a 20 20 2f 2a  er->sjfd);..  /*
a530: 20 54 68 65 20 74 65 6d 70 20 73 74 6f 72 61 67   The temp storag
a540: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
a550: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
a560: 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61  t */.  assert( a
a570: 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
a580: 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
a590: 70 44 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  pDone );.  asser
a5a0: 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
a5b0: 70 44 6f 6e 65 3d 3d 30 20 29 3b 0a 0a 20 20 72  pDone==0 );..  r
a5c0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
a5d0: 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e  fd, offset, &pgn
a5e0: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
a5f0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
a600: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
a610: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
a620: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
a630: 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
a640: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a650: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
a660: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
a670: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
a680: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
a690: 20 2b 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 34   + (isMainJrnl?4
a6a0: 3a 30 29 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  :0);..  /* Sanit
a6b0: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
a6c0: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
a6d0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
a6e0: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
a6f0: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
a700: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
a710: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
a720: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
a730: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
a740: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
a750: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
a760: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
a770: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
a780: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
a790: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
a7a0: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
a7b0: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
a7c0: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
a7d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
a7e0: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
a7f0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
a800: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
a810: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
a820: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
a830: 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
a840: 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
a850: 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
a860: 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
a870: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
a880: 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
a890: 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
a8a0: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66  ad32bits(jfd, of
a8b0: 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67  fset+pPager->pag
a8c0: 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29  eSize+4, &cksum)
a8d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
a8e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
a8f0: 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
a900: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
a910: 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  er, aData)!=cksu
a920: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
a930: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
a940: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
a950: 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71  Done && (rc = sq
a960: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
a970: 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 20 29 7b 0a  Done, pgno)) ){.
a980: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
a990: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
a9a0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
a9b0: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
a9c0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
a9d0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
a9e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
a9f0: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
aa00: 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ED state, then t
aa10: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
aa20: 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
aa30: 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
aa40: 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
aa50: 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
aa60: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
aa70: 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
aa80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
aa90: 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
aaa0: 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
aab0: 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
aac0: 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
aad0: 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
aae0: 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
aaf0: 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
ab00: 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
ab10: 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
ab20: 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
ab30: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
ab40: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
ab50: 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
ab60: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
ab70: 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
ab80: 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
ab90: 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
aba0: 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
abb0: 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
abc0: 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
abd0: 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
abe0: 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
abf0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
ac00: 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
ac10: 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
ac20: 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
ac30: 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
ac40: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
ac50: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
ac60: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
ac70: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
ac80: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
ac90: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
aca0: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
acb0: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
acc0: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
acd0: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
ace0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
acf0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
ad00: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
ad10: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
ad20: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
ad30: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
ad40: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
ad50: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
ad60: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
ad70: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
ad80: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
ad90: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
ada0: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
adb0: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
adc0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
add0: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
ade0: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
adf0: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
ae00: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
ae10: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
ae20: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
ae30: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
ae40: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
ae50: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
ae60: 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  re synced into t
ae70: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
ae80: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
ae90: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77  Otherwise, a pow
aea0: 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65  er loss might le
aeb0: 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74  ave modified dat
aec0: 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  a in the.  ** da
aed0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
aee0: 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  out an entry in 
aef0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
af00: 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20  rnal that can.  
af10: 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  ** restore the d
af20: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
af30: 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54  riginal form.  T
af40: 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
af50: 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62  st be.  ** met b
af60: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
af70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
af80: 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
af90: 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20  abase must be.  
afa0: 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  ** locked.  (2) 
afb0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
afc0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
afd0: 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20  ontent is fully 
afe0: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74  synced.  ** in t
aff0: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
b000: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
b010: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
b020: 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a  n cache or else.
b030: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73    ** the page is
b040: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
b050: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a  ync==0..  **.  *
b060: 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57  * 2008-04-14:  W
b070: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
b080: 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75  o vacuum a corru
b090: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
b0a0: 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  , it.  ** is pos
b0b0: 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20  sible to fail a 
b0c0: 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64  statement on a d
b0d0: 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65  atabase that doe
b0e0: 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e  s not yet exist.
b0f0: 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  .  ** Do not att
b100: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66  empt to write if
b110: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
b120: 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70  as never been op
b130: 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  ened..  */.  pPg
b140: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
b150: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
b160: 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c   PAGERTRACE(("PL
b170: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
b180: 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c  d hash(%08x) %s\
b190: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
b1a0: 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
b1b0: 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
b1c0: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
b1d0: 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61  >pageSize, aData
b1e0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
b1f0: 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d    (isMainJrnl?"m
b200: 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75  ain-journal":"su
b210: 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29  b-journal").  ))
b220: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
b230: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
b240: 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20 28  CLUSIVE).   && (
b250: 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
b260: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
b270: 45 45 44 5f 53 59 4e 43 29 29 0a 20 20 20 26 26  EED_SYNC)).   &&
b280: 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   (pPager->fd->pM
b290: 65 74 68 6f 64 73 29 0a 20 20 29 7b 0a 20 20 20  ethods).  ){.   
b2a0: 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
b2b0: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
b2c0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
b2d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
b2e0: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
b2f0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
b300: 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a  ageSize, ofst);.
b310: 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
b320: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
b330: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
b340: 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
b350: 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  no;.    }.  }els
b360: 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e  e if( !isMainJrn
b370: 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20  l && pPg==0 ){. 
b380: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
b390: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61   a rollback of a
b3a0: 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64   savepoint and d
b3b0: 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74  ata was not writ
b3c0: 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ten to.    ** th
b3d0: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
b3e0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
b3f0: 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20  n-memory, there 
b400: 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20  is a potential. 
b410: 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57     ** problem. W
b420: 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
b430: 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20  next fetched by 
b440: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
b450: 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  , it .    ** wil
b460: 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
b470: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b480: 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
b490: 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a  ay not be .    *
b4a0: 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20  * current. .    
b4b0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  **.    ** There 
b4c0: 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  are a couple of 
b4d0: 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74  different ways t
b4e0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20  his can happen. 
b4f0: 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20  All are quite.  
b500: 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68    ** obscure. Wh
b510: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79  en running in sy
b520: 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
b530: 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  this can only ha
b540: 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20  ppen .    ** if 
b550: 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74  the page is on t
b560: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20  he free-list at 
b570: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
b580: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
b590: 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  en.    ** popula
b5a0: 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20  ted, then moved 
b5b0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
b5c0: 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20  erMovepage()..  
b5d0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
b5e0: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61  solution is to a
b5f0: 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  dd an in-memory 
b600: 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68  page to the cach
b610: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  e containing.   
b620: 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73   ** the data jus
b630: 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  t read from the 
b640: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72  sub-journal. Mar
b650: 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
b660: 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20  rty .    ** and 
b670: 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71  if the pager req
b680: 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d  uires a journal-
b690: 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20  sync, then mark 
b6a0: 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20  the page as .   
b6b0: 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20   ** requiring a 
b6c0: 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66  journal-sync bef
b6d0: 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
b6e0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
b6f0: 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
b700: 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d  );.    if( (rc =
b710: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
b720: 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e  uire(pPager, pgn
b730: 6f 2c 20 26 70 50 67 2c 20 31 29 29 20 29 7b 0a  o, &pPg, 1)) ){.
b740: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
b750: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
b760: 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
b770: 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73  NEED_READ;.    s
b780: 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
b790: 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
b7a0: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
b7b0: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
b7c0: 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
b7d0: 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
b7e0: 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
b7f0: 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
b800: 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
b810: 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
b820: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
b830: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
b840: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
b850: 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
b860: 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
b870: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
b880: 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
b890: 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
b8a0: 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
b8b0: 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
b8c0: 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
b8d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
b8e0: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
b8f0: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
b900: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
b910: 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
b920: 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61  cpy(pData, aData
b930: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
b940: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
b950: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
b960: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
b970: 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
b980: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
b990: 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73  MainJrnl && (!is
b9a0: 53 61 76 65 70 6e 74 20 7c 7c 20 70 50 61 67 65  Savepnt || pPage
b9b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 3d 70  r->journalOff<=p
b9c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
b9d0: 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
b9e0: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
b9f0: 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
ba00: 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
ba10: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
ba20: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
ba30: 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
ba40: 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
ba50: 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
ba60: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
ba70: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
ba80: 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
ba90: 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
baa0: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
bab0: 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
bac0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
bad0: 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
bae0: 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
baf0: 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  the..      **.  
bb00: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
bb10: 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
bb20: 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
bb30: 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
bb40: 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
bb50: 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
bb60: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
bb70: 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
bb80: 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
bb90: 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
bba0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
bbb0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
bbc0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
bbd0: 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
bbe0: 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
bbf0: 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
bc00: 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
bc10: 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
bc20: 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
bc30: 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
bc40: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
bc50: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
bc60: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
bc70: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
bc80: 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
bc90: 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
bca0: 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
bcb0: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
bcc0: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
bcd0: 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
bce0: 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
bcf0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
bd00: 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
bd10: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
bd20: 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
bd30: 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
bd40: 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
bd50: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
bd60: 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
bd70: 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
bd80: 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
bd90: 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
bda0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
bdb0: 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
bdc0: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
bdd0: 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
bde0: 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
bdf0: 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
be00: 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
be10: 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
be20: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
be30: 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
be40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
be50: 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
be60: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
be70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
be80: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
be90: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
bea0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
beb0: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
bec0: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
bed0: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
bee0: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
bef0: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
bf00: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
bf10: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
bf20: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
bf30: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
bf40: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
bf50: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
bf60: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
bf70: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
bf80: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
bf90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
bfa0: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
bfb0: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
bfc0: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
bfd0: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
bfe0: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 73  >pgno, 3);.    s
bff0: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
c000: 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
c010: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c020: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
c030: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
c040: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
c050: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
c060: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
c070: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
c080: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
c090: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
c0a0: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
c0b0: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
c0c0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
c0d0: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
c0e0: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
c0f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
c100: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
c110: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
c120: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
c130: 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
c140: 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
c150: 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
c160: 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
c170: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
c180: 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
c190: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  ion..**.**.** Th
c1a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c1b0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
c1c0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
c1d0: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
c1e0: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
c1f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
c200: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
c210: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
c220: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
c230: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
c240: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
c250: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
c260: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
c270: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
c280: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
c290: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c2a0: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
c2b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
c2c0: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
c2d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
c2e0: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
c2f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
c300: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
c310: 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
c320: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
c330: 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  en = 0;.  sqlite
c340: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
c350: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
c360: 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61  *pJournal;.  cha
c370: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
c380: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
c390: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
c3a0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
c3b0: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
c3c0: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
c3d0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
c3e0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
c3f0: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
c400: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
c410: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
c420: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
c430: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
c440: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
c450: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
c460: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
c470: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
c480: 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
c490: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
c4a0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70 56  sqlite3Malloc(pV
c4b0: 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
c4c0: 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
c4d0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
c4e0: 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
c4f0: 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
c500: 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
c510: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
c520: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
c530: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c  else{.    int fl
c540: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
c550: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
c560: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
c570: 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
c580: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
c590: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
c5a0: 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
c5b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
c5c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
c5d0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
c5e0: 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  .  master_open =
c5f0: 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   1;..  rc = sqli
c600: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
c610: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
c620: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
c630: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
c640: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
c650: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
c660: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
c670: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
c680: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
c690: 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20  terPtr = 0;.    
c6a0: 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  int nMasterPtr =
c6b0: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
c6c0: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20  xPathname+1;..  
c6d0: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
c6e0: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
c6f0: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
c700: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
c710: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
c720: 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
c730: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
c740: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
c750: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
c760: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
c770: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28  )sqlite3Malloc((
c780: 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
c790: 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29  al + nMasterPtr)
c7a0: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
c7b0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
c7c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
c7d0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
c7e0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
c7f0: 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
c800: 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
c810: 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
c820: 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d  urnal];.    rc =
c830: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
c840: 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
c850: 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
c860: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
c870: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c880: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
c890: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
c8a0: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
c8b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
c8c0: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
c8d0: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
c8e0: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
c8f0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
c900: 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
c910: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
c920: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
c930: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
c940: 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
c950: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
c960: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c970: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
c980: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
c990: 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
c9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
c9b0: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
c9c0: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
c9d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c9e0: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
c9f0: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
ca00: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
ca10: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
ca20: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
ca30: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
ca40: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
ca50: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
ca60: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
ca70: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ca80: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
ca90: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
caa0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
cab0: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
cac0: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
cad0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
cae0: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
caf0: 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
cb00: 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
cb10: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
cb20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cb30: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
cb40: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
cb50: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
cb60: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
cb70: 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
cb80: 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
cb90: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
cba0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
cbb0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
cbc0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cbd0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
cbe0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
cbf0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
cc00: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
cc10: 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
cc20: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
cc30: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
cc40: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
cc50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
cc60: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
cc70: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
cc80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cc90: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
cca0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
ccb0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
ccc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
ccd0: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
cce0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
ccf0: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
cd00: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
cd10: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
cd20: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
cd30: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
cd40: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
cd50: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
cd60: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
cd70: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
cd80: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
cd90: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
cda0: 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
cdb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
cdc0: 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
cdd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
cde0: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
cdf0: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
ce00: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
ce10: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
ce20: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
ce30: 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61  ted. Also trunca
ce40: 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65  te the cached re
ce50: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
ce60: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
ce70: 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  Might might be t
ce80: 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
ce90: 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
cea0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50   smaller than nP
ceb0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e  age..** This can
cec0: 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61   happen, for exa
ced0: 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20  mple, if we are 
cee0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
cef0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
cf00: 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74 65  * which has exte
cf10: 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73 69  nded the file si
cf20: 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70  ze and the new p
cf30: 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61  ages are still a
cf40: 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61  ll held.** in ca
cf50: 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53  che, then an INS
cf60: 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f  ERT or UPDATE do
cf70: 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72  es a statement r
cf80: 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a  ollback.  Some.*
cf90: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
cfa0: 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
cfb0: 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
cfc0: 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20 74  sed if you try t
cfd0: 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20  o.** truncate a 
cfe0: 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
cff0: 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
d000: 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74   than it current
d010: 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74  ly is,.** so det
d020: 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
d030: 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
d040: 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 74 68   zero byte to th
d050: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
d060: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
d070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d080: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
d090: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
d0a0: 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
d0b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d0c0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
d0d0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
d0e0: 55 53 49 56 45 20 26 26 20 70 50 61 67 65 72 2d  USIVE && pPager-
d0f0: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
d100: 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
d110: 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
d120: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d130: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
d140: 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
d150: 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
d160: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
d170: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  ize*(i64)nPage;.
d180: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d190: 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
d1a0: 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
d1b0: 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
d1c0: 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
d1d0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
d1e0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
d1f0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
d200: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
d210: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
d220: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
d230: 70 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20  pPager->fd, "", 
d240: 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20  1, newSize-1);. 
d250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d260: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d270: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
d280: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
d290: 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
d2a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
d2b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d2c0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
d2d0: 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 73  e = nPage;.    s
d2e0: 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
d2f0: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
d300: 61 63 68 65 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ache, nPage);.  
d310: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
d320: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
d330: 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74  sectorSize for t
d340: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
d350: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72  **.** The sector
d360: 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65 61 73   size is at leas
d370: 74 20 61 73 20 62 69 67 20 61 73 20 74 68 65 20  t as big as the 
d380: 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f  sector size repo
d390: 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  rted.** by sqlit
d3a0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
d3b0: 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  .  The minimum s
d3c0: 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 35 31  ector size is 51
d3d0: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
d3e0: 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
d3f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
d400: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
d410: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
d420: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
d430: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
d440: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
d450: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
d460: 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
d470: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
d480: 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
d490: 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
d4a0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
d4b0: 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68  ed yet, in whcih
d4c0: 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
d4d0: 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
d4e0: 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
d4f0: 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
d500: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
d510: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
d520: 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
d530: 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
d540: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
d550: 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61  e<512 ){.    pPa
d560: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
d570: 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = 512;.  }.}../*
d580: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
d590: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
d5a0: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
d5b0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
d5c0: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
d5d0: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
d5e0: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
d5f0: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
d600: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d610: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
d620: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
d630: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
d640: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
d650: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
d660: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
d670: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
d680: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
d690: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
d6a0: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
d6b0: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
d6c0: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
d6d0: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
d6e0: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
d6f0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
d700: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
d710: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
d720: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
d730: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
d740: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
d750: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
d760: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
d770: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
d780: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
d790: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
d7a0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
d7b0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
d7c0: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
d7d0: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
d7e0: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
d7f0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
d800: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
d810: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
d820: 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
d830: 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
d840: 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
d850: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
d860: 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
d870: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
d880: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
d890: 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73 65  is the page case
d8a0: 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74  ..**  (7)  4 byt
d8b0: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
d8c0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
d8d0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
d8e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
d8f0: 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
d900: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
d910: 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
d920: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
d930: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
d940: 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20  urnal.).**  (8) 
d950: 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
d960: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
d970: 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
d980: 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
d990: 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
d9a0: 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
d9b0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
d9c0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
d9d0: 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
d9e0: 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
d9f0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
da00: 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
da10: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
da20: 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
da30: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
da40: 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
da50: 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29  n UTF-8..**  (9)
da60: 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
da70: 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
da80: 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
da90: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
daa0: 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
dab0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
dac0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
dad0: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
dae0: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
daf0: 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
db00: 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
db10: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
db20: 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
db30: 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d 73  he first 8 items
db40: 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
db50: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
db60: 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
db70: 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20 69  nce of the 9th i
db80: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
db90: 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
dba0: 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
dbb0: 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
dbc0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
dbd0: 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
dbe0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
dbf0: 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
dc00: 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
dc10: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
dc20: 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
dc30: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
dc40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
dc50: 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
dc60: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
dc70: 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
dc80: 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
dc90: 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
dca0: 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
dcb0: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
dcc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dcd0: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
dce0: 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
dcf0: 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
dd00: 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
dd10: 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
dd20: 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
dd30: 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
dd40: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
dd50: 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
dd60: 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
dd70: 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
dd80: 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
dd90: 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
dda0: 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
ddb0: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
ddc0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
ddd0: 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
dde0: 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
ddf0: 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
de00: 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
de10: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
de20: 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
de30: 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
de40: 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
de50: 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
de60: 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
de70: 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
de80: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
de90: 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
dea0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
deb0: 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
dec0: 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
ded0: 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
dee0: 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
def0: 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
df00: 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
df10: 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
df20: 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
df30: 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
df40: 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
df50: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
df60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
df70: 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
df80: 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
df90: 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
dfa0: 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
dfb0: 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
dfc0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
dfd0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
dfe0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
dff0: 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
e000: 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
e010: 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
e020: 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
e030: 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
e040: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
e050: 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
e060: 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
e070: 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
e080: 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
e090: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
e0a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
e0b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
e0c0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
e0d0: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
e0e0: 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
e0f0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
e100: 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
e110: 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
e140: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
e150: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
e160: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
e170: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e180: 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
e190: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
e1a0: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
e1b0: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
e1c0: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
e1d0: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
e1e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
e1f0: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
e200: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
e210: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
e240: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
e250: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
e260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
e270: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
e280: 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
e290: 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
e2a0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
e2b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
e2c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e2d0: 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
e2e0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
e2f0: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
e300: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
e310: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
e320: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
e330: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
e340: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
e350: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
e360: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
e370: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
e380: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
e390: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e3a0: 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
e3b0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
e3c0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
e3d0: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
e3e0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
e3f0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
e400: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
e410: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
e420: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e430: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
e440: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
e450: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
e460: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
e470: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
e480: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
e490: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
e4a0: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
e4b0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ck..  */.  zMast
e4c0: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
e4d0: 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
e4e0: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
e4f0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
e500: 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
e510: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
e520: 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
e530: 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
e540: 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
e550: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
e560: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
e570: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
e580: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
e590: 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
e5a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e5b0: 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
e5c0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
e5d0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
e5e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e5f0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
e600: 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
e610: 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20  either when the 
e620: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
e630: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20   call returns.  
e640: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ** SQLITE_DONE o
e650: 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  r an IO error oc
e660: 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65  curs. */.  while
e670: 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52  ( 1 ){..    /* R
e680: 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
e690: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
e6a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e6b0: 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
e6c0: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
e6d0: 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
e6e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e6f0: 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
e700: 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
e710: 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
e720: 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
e730: 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65  ss must of faile
e740: 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
e750: 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
e760: 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
e770: 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
e780: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
e790: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
e7a0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
e7b0: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
e7c0: 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69  c, &mxPg);.    i
e7d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e7e0: 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72   ){ .      if( r
e7f0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
e800: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
e810: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
e820: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
e830: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
e840: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
e850: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
e860: 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61  then this journa
e870: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  l was created by
e880: 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a   a process.    *
e890: 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d  * working in no-
e8a0: 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20  sync mode. This 
e8b0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
e8c0: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
e8d0: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  al.    ** file c
e8e0: 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73  onsists of pages
e8f0: 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  , there are no m
e900: 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ore journal head
e910: 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20  ers. Compute.   
e920: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
e930: 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74   nRec based on t
e940: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a  his assumption..
e950: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
e960: 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
e970: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e980: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e990: 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
e9a0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
e9b0: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
e9c0: 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  )((szJ - JOURNAL
e9d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
e9e0: 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
e9f0: 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
ea00: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
ea10: 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c  s 0 and this rol
ea20: 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72  lback is of a tr
ea30: 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65  ansaction create
ea40: 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a  d by this.    **
ea50: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20   process and if 
ea60: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61  this is the fina
ea70: 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
ea80: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74  journal, then it
ea90: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
eaa0: 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  at this part of 
eab0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
eac0: 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74  being filled but
ead0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
eae0: 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20  n.    ** synced 
eaf0: 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74  to disk.  Comput
eb00: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
eb10: 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74  pages based on t
eb20: 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20  he remaining.   
eb30: 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
eb40: 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
eb50: 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65   ** The third te
eb60: 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77  rm of the test w
eb70: 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20  as added to fix 
eb80: 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20  ticket #2565..  
eb90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
eba0: 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
ebb0: 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
ebc0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
ebd0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
ebe0: 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
ebf0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
ec00: 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
ec10: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
ec20: 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
ec30: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
ec40: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
ec50: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
ec60: 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
ec70: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
ec80: 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
ec90: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
eca0: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
ecb0: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
ecc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ecd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ece0: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
ecf0: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
ed00: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
ed10: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
ed20: 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
ed30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ed40: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
ed50: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
ed60: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ed70: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
ed80: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
ed90: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
eda0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
edb0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
edc0: 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
edd0: 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
ede0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
edf0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
ee00: 70 50 61 67 65 72 2c 20 31 2c 20 70 50 61 67 65  pPager, 1, pPage
ee10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 30  r->journalOff, 0
ee20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
ee30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ee40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
ee50: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
ee60: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
ee70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
ee80: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
ee90: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
eea0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
eeb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
eec0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
eed0: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
eee0: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
eef0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 70 72  e database is pr
ef00: 6f 62 61 62 6c 79 0a 20 20 20 20 20 20 20 20 20  obably.         
ef10: 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20 65 6e 64   ** going to end
ef20: 20 75 70 20 62 65 69 6e 67 20 63 6f 72 72 75 70   up being corrup
ef30: 74 2e 20 20 49 74 20 69 73 20 63 6f 72 72 75 70  t.  It is corrup
ef40: 74 20 74 6f 20 75 73 2c 20 61 6e 79 68 6f 77 2e  t to us, anyhow.
ef50: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 50 65  .          ** Pe
ef60: 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 20 70  rhaps the next p
ef70: 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
ef80: 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20 69 74 2e  long can fix it.
ef90: 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ....          */
efa0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
efb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
efc0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
efd0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
efe0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
eff0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
f000: 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
f010: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
f020: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
f030: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f040: 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
f050: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
f060: 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
f070: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
f080: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
f090: 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
f0a0: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
f0b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
f0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f0d0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
f0e0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
f0f0: 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
f100: 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69 66  ='\0');.  }.  if
f110: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f120: 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
f130: 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
f140: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
f150: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
f160: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
f170: 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
f180: 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
f190: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
f1a0: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
f1b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
f1c0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
f1d0: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
f1e0: 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
f1f0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
f200: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
f210: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
f220: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
f230: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
f240: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
f250: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
f260: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
f270: 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
f280: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
f290: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
f2a0: 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
f2b0: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
f2c0: 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
f2d0: 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
f2e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f2f0: 2a 20 50 6c 61 79 62 61 63 6b 20 61 20 73 61 76  * Playback a sav
f300: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
f310: 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
f320: 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
f330: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
f340: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
f350: 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
f360: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
f370: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
f380: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
f390: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f3a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
f3b0: 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65   End of first se
f3c0: 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f  gment of main-jo
f3d0: 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f  urnal records */
f3e0: 0a 20 20 50 67 6e 6f 20 69 69 3b 20 20 20 20 20  .  Pgno ii;     
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f400: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
f410: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f420: 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
f430: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
f440: 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
f450: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
f460: 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
f470: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
f480: 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 2f 2a 20  y once */..  /* 
f490: 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65  Allocate a bitve
f4a0: 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72  c to use to stor
f4b0: 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67  e the set of pag
f4c0: 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a  es rolled back *
f4d0: 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
f4e0: 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20  nt ){.    pDone 
f4f0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
f500: 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74  reate(pSavepoint
f510: 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66  ->nOrig);.    if
f520: 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ( !pDone ){.    
f530: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f540: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
f550: 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20  ..  /* Truncate 
f560: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63  the database bac
f570: 6b 20 74 6f 20 74 68 65 20 73 69 7a 65 20 69 74  k to the size it
f580: 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
f590: 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  .  ** savepoint 
f5a0: 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
f5b0: 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
f5c0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
f5d0: 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 3f 70 53   = pSavepoint?pS
f5e0: 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 3a  avepoint->nOrig:
f5f0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
f600: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ze;.  assert( pP
f610: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
f620: 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
f630: 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 62 61 63 6b  /* Now roll back
f640: 20 61 6c 6c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   all main journa
f650: 6c 20 66 69 6c 65 20 72 65 63 6f 72 64 73 20 74  l file records t
f660: 68 61 74 20 6f 63 63 75 72 20 61 66 74 65 72 20  hat occur after 
f670: 62 79 74 65 0a 20 20 2a 2a 20 62 79 74 65 20 6f  byte.  ** byte o
f680: 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
f690: 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 74 68 61  oint.iOffset tha
f6a0: 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75  t have a page nu
f6b0: 6d 62 65 72 20 6c 65 73 73 20 74 68 61 6e 0a 20  mber less than. 
f6c0: 20 2a 2a 20 6f 72 20 65 71 75 61 6c 20 74 6f 20   ** or equal to 
f6d0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e  PagerSavepoint.n
f6e0: 4f 72 69 67 2e 20 41 73 20 65 61 63 68 20 72 65  Orig. As each re
f6f0: 63 6f 72 64 20 69 73 20 70 6c 61 79 65 64 20 62  cord is played b
f700: 61 63 6b 2c 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ack,.  ** the co
f710: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
f720: 69 6e 20 62 69 74 76 65 63 20 50 61 67 65 72 53  in bitvec PagerS
f730: 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
f740: 70 6f 69 6e 74 20 69 73 20 0a 20 20 2a 2a 20 63  point is .  ** c
f750: 6c 65 61 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  leared..  */.  s
f760: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
f770: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 70  rnalOff;.  if( p
f780: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
f790: 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
f7a0: 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
f7b0: 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
f7c0: 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
f7d0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
f7e0: 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
f7f0: 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
f800: 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
f810: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
f820: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
f830: 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
f840: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
f850: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
f860: 67 65 72 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e  ger, 1, pPager->
f870: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70  journalOff, 1, p
f880: 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61 73 73  Done);.      ass
f890: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
f8a0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20  DONE );.    }.  
f8b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
f8c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
f8d0: 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  0;.  }.  while( 
f8e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
f8f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f900: 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
f910: 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20  32 nJRec = 0;   
f920: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a    /* Number of J
f930: 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a  ournal Records *
f940: 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b  /.    u32 dummy;
f950: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
f960: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
f970: 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
f980: 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
f990: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
f9a0: 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4a  NE );.    if( nJ
f9b0: 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rec==0 ){.      
f9c0: 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
f9d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f9e0: 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61  f) / (pPager->pa
f9f0: 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d  geSize+8);.    }
fa00: 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  .    for(ii=0; r
fa10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
fa20: 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67  ii<nJRec && pPag
fa30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
fa40: 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  zJ; ii++){.     
fa50: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
fa60: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
fa70: 61 67 65 72 2c 20 31 2c 20 70 50 61 67 65 72 2d  ager, 1, pPager-
fa80: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20  >journalOff, 1, 
fa90: 70 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61 73  pDone);.      as
faa0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
fab0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20  _DONE );.    }. 
fac0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
fad0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
fae0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
faf0: 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 4e  ==szJ );..  /* N
fb00: 6f 77 20 72 6f 6c 6c 20 62 61 63 6b 20 70 61 67  ow roll back pag
fb10: 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
fb20: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 66  journal. */.  if
fb30: 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
fb40: 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
fb50: 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
fb60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 69  rc==SQLITE_OK&&i
fb70: 69 3c 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73  i<(u32)pPager->s
fb80: 74 6d 74 4e 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  tmtNRec; ii++){.
fb90: 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
fba0: 20 3d 20 69 69 2a 28 34 2b 70 50 61 67 65 72 2d   = ii*(4+pPager-
fbb0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
fbc0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
fbd0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
fbe0: 50 61 67 65 72 2c 20 30 2c 20 6f 66 66 73 65 74  Pager, 0, offset
fbf0: 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20  , 1, pDone);.   
fc00: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
fc10: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
fc20: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
fc30: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
fc40: 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63  pDone);.  if( rc
fc50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
fc60: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
fc70: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  alOff = szJ;.  }
fc80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fc90: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
fca0: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
fcb0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
fcc0: 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
fcd0: 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
fce0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
fcf0: 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
fd00: 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
fd10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
fd20: 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  heSetCachesize(p
fd30: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
fd40: 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
fd50: 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
fd60: 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
fd70: 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
fd80: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
fd90: 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
fda0: 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
fdb0: 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
fdc0: 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
fdd0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
fde0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
fdf0: 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
fe00: 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
fe10: 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
fe20: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
fe30: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
fe40: 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
fe50: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
fe60: 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
fe70: 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
fe80: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
fe90: 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
fea0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
feb0: 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
fec0: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
fed0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
fee0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
fef0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
ff00: 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
ff10: 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
ff20: 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
ff30: 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
ff40: 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
ff50: 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
ff60: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
ff70: 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
ff80: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
ff90: 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
ffa0: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
ffb0: 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
ffc0: 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
ffd0: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
ffe0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
fff0: 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
10000 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
10010 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
10020 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
10030 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
10040 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
10050 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
10060 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
10070 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
10080 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
10090 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
100a0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
100b0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
100c0 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
100d0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
100e0 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
10100 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
10110 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
10120 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
10130 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
10140 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
10150 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
10160 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
10170 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
10180 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
10190 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
101a0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
101b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
101c0 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
101d0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
101e0 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
101f0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
10200 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
10210 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
10220 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
10230 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
10240 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
10250 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10260 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
10270 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
10280 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
10290 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
102a0 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
102b0 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a  nt bFullFsync){.
102c0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
102d0 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c   =  (level==1 ||
102e0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
102f0 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
10300 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c  r->fullSync = (l
10310 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
10320 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
10330 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :0;.  pPager->sy
10340 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c  nc_flags = (bFul
10350 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59  lFsync?SQLITE_SY
10360 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53  NC_FULL:SQLITE_S
10370 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69  YNC_NORMAL);.  i
10380 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
10390 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
103a0 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  Sync = 0;.}.#end
103b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
103c0 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
103d0 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
103e0 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
103f0 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
10400 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
10410 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
10420 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
10430 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
10440 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
10450 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
10460 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
10470 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
10480 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
10490 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
104a0 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
104b0 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rary file. .**.*
104c0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
104d0 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
104e0 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
104f0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
10500 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
10510 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
10520 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f  f we fail. The O
10530 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
10540 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
10550 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
10560 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
10570 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
10580 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
10590 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
105a0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
105b0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
105c0 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
105d0 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
105e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
105f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
10600 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
10610 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
10620 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
10630 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
10640 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
10650 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
10660 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
10670 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
10680 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
10690 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
106a0 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
106b0 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
106c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
106d0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
106e0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
106f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
10700 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
10710 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
10720 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
10730 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
10740 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
10750 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
10760 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
10770 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10780 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  || pFile->pMetho
10790 64 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ds );.  return r
107a0 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
107b0 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
107c0 64 20 2a 2c 50 67 48 64 72 20 2a 29 3b 0a 0a 2f  d *,PgHdr *);../
107d0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
107e0 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  w page cache and
107f0 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
10800 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
10810 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a   in *ppPager..**
10820 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   The file to be 
10830 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20  cached need not 
10840 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65  exist.  The file
10850 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75   is not locked u
10860 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73  ntil.** the firs
10870 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
10880 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20  3PagerGet() and 
10890 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
108a0 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
108b0 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
108c0 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
108d0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a  e3PagerUnref()..
108e0 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
108f0 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
10900 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
10910 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
10920 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
10930 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
10940 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
10950 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
10960 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
10970 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
10980 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
10990 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
109a0 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
109b0 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  then all informa
109c0 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
109d0 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20  cache..** It is 
109e0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
109f0 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e   disk.  This can
10a00 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
10a10 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d  ement an.** in-m
10a20 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
10a30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
10a40 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
10a50 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
10a60 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
10a70 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
10a80 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
10a90 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
10aa0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
10ab0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
10ac0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
10ad0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
10ae0 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
10af0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10b00 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
10b10 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
10b20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
10b30 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
10b40 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
10b50 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
10b60 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
10b70 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
10b80 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
10b90 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
10ba0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
10bb0 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
10bc0 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
10bd0 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
10be0 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
10bf0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
10c00 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
10c10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
10c20 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
10c30 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
10c40 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
10c50 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
10c60 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
10c70 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
10c80 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
10c90 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
10ca0 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
10cb0 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
10cc0 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  !=0;.  int journ
10cd0 61 6c 46 69 6c 65 53 69 7a 65 3b 0a 20 20 69 6e  alFileSize;.  in
10ce0 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73  t pcacheSize = s
10cf0 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
10d00 28 29 3b 0a 20 20 69 6e 74 20 73 7a 50 61 67 65  ();.  int szPage
10d10 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  Dflt = SQLITE_DE
10d20 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
10d30 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
10d40 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  me = 0;.  int nP
10d50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  athname = 0;..  
10d60 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
10d70 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c  alSize(pVfs)>sql
10d80 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
10d90 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72  ze() ){.    jour
10da0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71  nalFileSize = sq
10db0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
10dc0 28 70 56 66 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pVfs);.  }else{
10dd0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
10de0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4d 65  Size = sqlite3Me
10df0 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 3b 0a  mJournalSize();.
10e00 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65    }..  /* The de
10e10 66 61 75 6c 74 20 72 65 74 75 72 6e 20 69 73 20  fault return is 
10e20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 2a  a NULL pointer *
10e30 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
10e40 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
10e50 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
10e60 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
10e70 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
10e80 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
10e90 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
10ea0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
10eb0 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
10ec0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
10ed0 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
10ee0 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
10ef0 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
10f00 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
10f10 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
10f20 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
10f30 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
10f40 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
10f50 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
10f60 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
10f70 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20  nPathname*2);.  
10f80 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
10f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
10fa0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10fb0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
10fc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
10fd0 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
10fe0 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
10ff0 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
11000 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
11010 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b        zPathname[
11020 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  0] = 0;.    }els
11030 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
11040 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11050 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
11060 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
11070 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
11080 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hname);.    }.  
11090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
110a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
110b0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
110c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
110d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
110e0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
110f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
11100 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20  thname);.  }..  
11110 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
11120 72 79 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  ry for the pager
11130 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
11140 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
11150 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
11160 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
11170 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
11180 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
11190 2f 0a 20 20 20 20 70 63 61 63 68 65 53 69 7a 65  /.    pcacheSize
111a0 20 20 20 20 20 20 2b 20 20 20 20 20 20 20 20 20        +         
111b0 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
111c0 63 74 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  ct */.    journa
111d0 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20  lFileSize +     
111e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
111f0 72 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74  rnal file struct
11200 75 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73  ure */ .    pVfs
11210 2d 3e 73 7a 4f 73 46 69 6c 65 20 20 2b 20 20 20  ->szOsFile  +   
11220 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
11230 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
11240 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
11250 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 2f  ze * 2 +       /
11260 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61  * The two journa
11270 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20  l files */ .    
11280 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 30  3*nPathname + 40
11290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
112a0 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63  Filename, zDirec
112b0 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a  tory, zJournal *
112c0 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70 50  /.  );.  if( !pP
112d0 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ager ){.    sqli
112e0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
112f0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
11300 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11310 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  }.  pPager->pPCa
11320 63 68 65 20 3d 20 28 50 43 61 63 68 65 20 2a 29  che = (PCache *)
11330 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50  &pPager[1];.  pP
11340 74 72 20 3d 20 28 28 75 38 20 2a 29 26 70 50 61  tr = ((u8 *)&pPa
11350 67 65 72 5b 31 5d 29 20 2b 20 70 63 61 63 68 65  ger[1]) + pcache
11360 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
11370 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
11380 61 67 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ags;.  pPager->f
11390 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
113a0 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73  e*)&pPtr[pVfs->s
113b0 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50  zOsFile*0];.  pP
113c0 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
113d0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74  lite3_file*)&pPt
113e0 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
113f0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  ];.  pPager->jfd
11400 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
11410 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
11420 4f 73 46 69 6c 65 2b 6a 6f 75 72 6e 61 6c 46 69  OsFile+journalFi
11430 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  leSize];.  pPage
11440 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  r->zFilename = (
11450 63 68 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73  char*)&pPtr[pVfs
11460 2d 3e 73 7a 4f 73 46 69 6c 65 2b 32 2a 6a 6f 75  ->szOsFile+2*jou
11470 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20  rnalFileSize];. 
11480 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
11490 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
114a0 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61  Filename[nPathna
114b0 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  me+1];.  pPager-
114c0 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
114d0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
114e0 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20  nPathname+1];.  
114f0 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
11500 56 66 73 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  Vfs;.  if( zPath
11510 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63  name ){.    memc
11520 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
11530 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
11540 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20   nPathname+1);. 
11550 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11560 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
11570 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
11580 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
11590 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
115a0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
115b0 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  && !memDb ){.   
115c0 20 69 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28   if( nPathname>(
115d0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
115e0 20 2d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 22   - (int)sizeof("
115f0 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20  -journal")) ){. 
11600 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11610 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
11620 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
11630 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
11640 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
11650 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
11660 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
11670 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20  er->fd,.        
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11690 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
116a0 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  s, &fout);.     
116b0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75   readOnly = (fou
116c0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
116d0 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20  ADONLY);..      
116e0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
116f0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
11700 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
11710 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
11720 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
11730 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
11740 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
11750 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
11760 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
11770 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61  e file. The defa
11780 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
11790 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a   the maximum of:
117a0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
117b0 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
117c0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
117d0 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20  ,.      **    + 
117e0 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
117f0 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
11800 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
11810 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
11820 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
11830 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
11840 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
11850 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
11860 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11870 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b   && !readOnly ){
11880 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65  .        int iSe
11890 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
118a0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
118b0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
118c0 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
118d0 6c 74 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29  lt<iSectorSize )
118e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
118f0 67 65 44 66 6c 74 20 3d 20 69 53 65 63 74 6f 72  geDflt = iSector
11900 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
11910 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11920 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
11930 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  E.        {.    
11940 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
11950 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
11960 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
11970 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
11980 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
11990 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
119a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
119b0 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
119c0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
119d0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
119e0 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
119f0 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
11a00 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
11a10 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
11a20 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
11a30 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d           for(ii=
11a40 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
11a50 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
11a60 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
11a70 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
11a80 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
11a90 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
11aa0 7c 28 69 69 3e 3e 38 29 29 20 29 20 73 7a 50 61  |(ii>>8)) ) szPa
11ab0 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
11ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11ad0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
11ae0 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
11af0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
11b00 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
11b10 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
11b20 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d  eDflt = SQLITE_M
11b30 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
11b40 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SIZE;.        }.
11b50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11b60 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
11b70 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
11b80 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
11b90 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
11ba0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
11bb0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
11bc0 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
11bd0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
11be0 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
11bf0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
11c00 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
11c10 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
11c20 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
11c30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
11c40 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
11c50 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
11c60 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
11c70 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
11c80 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
11c90 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
11ca0 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
11cb0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
11cc0 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
11cd0 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
11ce0 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
11cf0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
11d00 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d   .    tempFile =
11d10 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
11d20 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
11d30 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20  CLUSIVE;.  }..  
11d40 69 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63  if( pPager && rc
11d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11d60 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
11d70 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
11d80 67 65 4d 61 6c 6c 6f 63 28 73 7a 50 61 67 65 44  geMalloc(szPageD
11d90 66 6c 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  flt);.  }..  /* 
11da0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
11db0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
11dc0 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
11dd0 65 2e 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65  e..  ** Free the
11de0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
11df0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
11e00 69 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20  ile..  ** Since 
11e10 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
11e20 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65   allocated there
11e30 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73   is no need to s
11e40 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67  et .  ** any Pag
11e50 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61  er.errMask varia
11e60 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  bles..  */.  if(
11e70 20 21 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61   !pPager || !pPa
11e80 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  ger->pTmpSpace )
11e90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11ea0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
11eb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
11ec0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
11ed0 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c  return ((rc==SQL
11ee0 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e  ITE_OK)?SQLITE_N
11ef0 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 20 20  OMEM:rc);.  }.  
11f00 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
11f10 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
11f20 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
11f30 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
11f40 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
11f50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11f60 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
11f70 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
11f80 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
11f90 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
11fa0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
11fb0 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
11fc0 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
11fd0 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
11fe0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
11ff0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
12000 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
12010 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
12020 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  ))..  /* Fill in
12030 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72   Pager.zDirector
12040 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  y[] */.  memcpy(
12050 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
12060 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ry, pPager->zFil
12070 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
12080 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  +1);.  for(i=sql
12090 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 50 61  ite3Strlen30(pPa
120a0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29  ger->zDirectory)
120b0 3b 20 0a 20 20 20 20 20 20 69 3e 30 20 26 26 20  ; .      i>0 && 
120c0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
120d0 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
120e0 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
120f0 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
12100 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20  ory[i-1] = 0;.. 
12110 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65   /* Fill in Page
12120 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a  r.zJournal[] */.
12130 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
12140 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ){.    memcpy(pP
12150 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
12160 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
12170 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
12180 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
12190 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
121a0 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
121b0 6c 22 2c 20 39 29 3b 0a 20 20 7d 65 6c 73 65 7b  l", 9);.  }else{
121c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
121d0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 0a  urnal = 0;.  }..
121e0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75    /* pPager->jou
121f0 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  rnalOpen = 0; */
12200 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
12210 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a  urnal = (u8)useJ
12220 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
12230 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  ->noReadlock = (
12240 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
12250 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20  adOnly) ?1:0;.  
12260 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
12270 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
12280 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
12290 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
122a0 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
122b0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
122c0 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 28 75 38  bSizeValid = (u8
122d0 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
122e0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 73 7a 50  ->pageSize = szP
122f0 61 67 65 44 66 6c 74 3b 0a 20 20 2f 2a 20 70 50  ageDflt;.  /* pP
12300 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
12310 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
12320 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
12330 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
12340 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
12350 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
12360 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65  e = 100;.  pPage
12370 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
12380 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
12390 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
123a0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
123b0 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
123c0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
123d0 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
123e0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
123f0 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
12400 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
12410 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
12420 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
12430 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
12440 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
12450 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
12460 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
12470 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
12480 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
12490 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
124a0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
124b0 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
124c0 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
124d0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
124e0 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
124f0 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
12500 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
12510 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
12520 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
12530 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  8)readOnly;.  /*
12540 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
12550 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
12560 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 28 70 50  er->noSync = (pP
12570 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
12580 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 29 20 3f  | !useJournal) ?
12590 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
125a0 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72  ullSync = pPager
125b0 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20  ->noSync ?0:1;. 
125c0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
125d0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
125e0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70  C_NORMAL;.  /* p
125f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
12600 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
12610 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
12620 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
12630 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
12640 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
12650 74 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20  tra = nExtra;.  
12660 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
12670 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54  izeLimit = SQLIT
12680 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41  E_DEFAULT_JOURNA
12690 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20  L_SIZE_LIMIT;.  
126a0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
126b0 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 74 65 6d  d->pMethods||tem
126c0 70 46 69 6c 65 29 3b 0a 20 20 73 65 74 53 65 63  pFile);.  setSec
126d0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
126e0 0a 20 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  .  if( memDb ){.
126f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
12700 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
12710 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
12720 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
12730 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
12740 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
12750 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
12760 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
12770 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
12780 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
12790 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
127a0 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67  h)); */.  *ppPag
127b0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
127c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
127d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
127e0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
127f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
12800 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
12810 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
12820 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
12830 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
12840 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 0a 20 20  ler)(void *),.  
12850 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
12860 65 72 41 72 67 0a 29 7b 20 20 0a 20 20 70 50 61  erArg.){  .  pPa
12870 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
12880 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
12890 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
128a0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
128b0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d  usyHandlerArg;.}
128c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
128d0 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f  reinitializer fo
128e0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49  r this pager.  I
128f0 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
12900 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
12910 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
12920 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
12930 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
12940 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
12950 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61  s original.** va
12960 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  lue as a result 
12970 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20  of a rollback.  
12980 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76  The callback giv
12990 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  es higher-level 
129a0 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72  code.** an oppor
129b0 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72  tunity to restor
129c0 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74  e the EXTRA sect
129d0 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74  ion to agree wit
129e0 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a  h the restored.*
129f0 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  * page data..*/.
12a00 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
12a10 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67  rSetReiniter(Pag
12a20 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
12a30 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
12a40 67 65 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  ge*)){.  pPager-
12a50 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
12a60 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  init;.}../*.** S
12a70 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  et the page size
12a80 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20   to *pPageSize. 
12a90 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e  If the suggest n
12aa0 65 77 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a  ew page size is.
12ab0 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  ** inappropriate
12ac0 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e  , then an altern
12ad0 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20  ative page size 
12ae0 69 73 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a  is set to that.*
12af0 2a 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  * value before r
12b00 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
12b10 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
12b20 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a  Pagesize(Pager *
12b30 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61  pPager, u16 *pPa
12b40 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  geSize){.  int r
12b50 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
12b60 6f 64 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ode;.  if( rc==S
12b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12b80 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u16 pageSize = *
12b90 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  pPageSize;.    a
12ba0 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d  ssert( pageSize=
12bb0 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e  =0 || (pageSize>
12bc0 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
12bd0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
12be0 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69  E_SIZE) );.    i
12bf0 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  f( pageSize && p
12c00 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
12c10 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 20  >pageSize .     
12c20 26 26 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44  && (pPager->memD
12c30 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  b==0 || pPager->
12c40 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20  dbSize==0).     
12c50 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
12c60 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
12c70 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20  >pPCache)==0 .  
12c80 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20    ){.      char 
12c90 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29  *pNew = (char *)
12ca0 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
12cb0 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  c(pageSize);.   
12cc0 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a     if( !pNew ){.
12cd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
12ce0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
12cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12d00 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
12d10 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  er);.        pPa
12d20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
12d30 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
12d40 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
12d50 65 6d 44 62 20 29 20 73 65 74 53 65 63 74 6f 72  emDb ) setSector
12d60 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
12d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
12d80 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
12d90 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
12da0 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
12db0 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
12dc0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
12dd0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
12de0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
12df0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
12e00 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67  .    }.    *pPag
12e10 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61  eSize = (u16)pPa
12e20 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
12e30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12e40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
12e50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
12e60 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
12e70 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
12e80 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
12e90 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
12ea0 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
12eb0 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
12ec0 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
12ed0 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
12ee0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
12ef0 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
12f00 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
12f10 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
12f20 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
12f30 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
12f40 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
12f50 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
12f60 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
12f70 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
12f80 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
12f90 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
12fa0 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
12fb0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
12fc0 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
12fd0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
12fe0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
12ff0 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
13000 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
13010 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
13020 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
13030 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
13040 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
13050 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
13060 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
13070 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
13080 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
13090 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
130a0 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
130b0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
130c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
130d0 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
130e0 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
130f0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
13100 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
13110 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
13120 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
13130 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
13140 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
13150 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
13160 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
13170 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
13180 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65   }.  sqlite3Page
13190 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
131a0 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r, 0);.  return 
131b0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a  pPager->mxPgno;.
131c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
131d0 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f  lowing set of ro
131e0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
131f0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73  to disable the s
13200 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20  imulated.** I/O 
13210 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e  error mechanism.
13220 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73    These routines
13230 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f   are used to avo
13240 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  id simulated.** 
13250 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73  errors in places
13260 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
13270 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f   care about erro
13280 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73  rs..**.** Unless
13290 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31   -DSQLITE_TEST=1
132a0 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20   is used, these 
132b0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c  routines are all
132c0 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67   no-ops.** and g
132d0 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e  enerate no code.
132e0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
132f0 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e  E_TEST.extern in
13300 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
13310 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65  or_pending;.exte
13320 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
13330 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61  o_error_hit;.sta
13340 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e  tic int saved_cn
13350 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  t;.void disable_
13360 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
13370 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
13380 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
13390 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
133a0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
133b0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
133c0 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
133d0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
133e0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
133f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
13400 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
13410 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
13420 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69  efine disable_si
13430 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
13440 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61  s().# define ena
13450 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
13460 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66  _errors().#endif
13470 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
13480 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66   first N bytes f
13490 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rom the beginnin
134a0 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  g of the file in
134b0 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61  to memory.** tha
134c0 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74  t pDest points t
134d0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72  o. .**.** No err
134e0 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  or checking is d
134f0 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  one. The rationa
13500 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  l for this is th
13510 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
13520 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c   .** may be call
13530 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66  ed even if the f
13540 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
13550 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20  st or contain a 
13560 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74  header. In .** t
13570 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74  hese cases sqlit
13580 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20  e3OsRead() will 
13590 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c  return an error,
135a0 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f   to which the co
135b0 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e  rrect .** respon
135c0 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68  se is to zero th
135d0 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73  e memory at pDes
135e0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20  t and continue. 
135f0 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72   A real IO error
13600 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d   .** will presum
13610 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62  ably recur and b
13620 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65  e picked up late
13630 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61  r (Todo: Think a
13640 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69  bout this)..*/.i
13650 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
13660 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
13670 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
13680 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
13690 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
136a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
136b0 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
136c0 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
136d0 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
136e0 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
136f0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
13700 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
13710 68 6f 64 73 20 29 7b 0a 20 20 20 20 49 4f 54 52  hods ){.    IOTR
13720 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
13730 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
13740 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
13750 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
13760 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
13770 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
13780 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
13790 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
137a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
137b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
137c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
137d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
137e0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
137f0 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
13800 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
13810 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a  ith.** pPager. .
13820 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e  **.** If the PEN
13830 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f  DING_BYTE lies o
13840 6e 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63  n the page direc
13850 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e  tly after the en
13860 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  d of the.** file
13870 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20  , then consider 
13880 74 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f  this page part o
13890 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20  f the file too. 
138a0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  For example, if.
138b0 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ** PENDING_BYTE 
138c0 69 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68  is byte 4096 (th
138d0 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
138e0 70 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20  page 5) and the 
138f0 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  size of the.** f
13900 69 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65  ile is 4096 byte
13910 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64  s, 5 is returned
13920 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a   instead of 4..*
13930 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
13940 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
13950 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
13960 70 6e 50 61 67 65 29 7b 0a 20 20 69 36 34 20 6e  pnPage){.  i64 n
13970 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
13980 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13990 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
139a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
139b0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
139c0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65  >errCode;.    re
139d0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
139e0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
139f0 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 20  eValid ){.    n 
13a00 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
13a10 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
13a20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
13a30 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
13a40 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
13a50 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72  .    if( (pPager
13a60 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a  ->fd->pMethods).
13a70 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71       && (rc = sq
13a80 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
13a90 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29  pPager->fd, &n))
13aa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13ab0 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
13ac0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
13ad0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13ae0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
13af0 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
13b00 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
13b10 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 1;.    }else
13b20 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61  {.      n /= pPa
13b30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
13b40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
13b50 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
13b60 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
13b70 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
13b80 20 3d 20 28 50 67 6e 6f 29 6e 3b 0a 20 20 20 20   = (Pgno)n;.    
13b90 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
13ba0 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 6e 3b 0a  Size = (Pgno)n;.
13bb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
13bc0 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20  SizeValid = 1;. 
13bd0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
13be0 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
13bf0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
13c00 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
13c10 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72  }.  if( n>pPager
13c20 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
13c30 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
13c40 20 28 50 67 6e 6f 29 6e 3b 0a 20 20 7d 0a 20 20   (Pgno)n;.  }.  
13c50 69 66 28 20 70 6e 50 61 67 65 20 29 7b 0a 20 20  if( pnPage ){.  
13c60 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74    *pnPage = (int
13c70 29 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  )n;.  }.  return
13c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13c90 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
13ca0 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
13cb0 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
13cc0 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a  al(Pager*);../*.
13cd0 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
13ce0 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c   a lock on a fil
13cf0 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  e.  Invoke the b
13d00 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
13d10 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63  the lock.** is c
13d20 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
13d30 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20  ilable.  Repeat 
13d40 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
13d50 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a  allback returns.
13d60 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ** false or unti
13d70 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  l the lock succe
13d80 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
13d90 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
13da0 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
13db0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
13dc0 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
13dd0 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
13de0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
13df0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
13e00 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
13e10 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
13e20 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20  c;..  /* The OS 
13e30 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74  lock values must
13e40 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
13e50 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76  the Pager lock v
13e60 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  alues */.  asser
13e70 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d  t( PAGER_SHARED=
13e80 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
13e90 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
13ea0 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56  RESERVED==RESERV
13eb0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
13ec0 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55  ert( PAGER_EXCLU
13ed0 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f  SIVE==EXCLUSIVE_
13ee0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
13ef0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72   the file is cur
13f00 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20  rently unlocked 
13f10 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75  then the size mu
13f20 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f  st be unknown */
13f30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
13f40 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
13f50 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72  SHARED || pPager
13f60 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30  ->dbSizeValid==0
13f70 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
13f80 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
13f90 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
13fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
13fb0 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
13fc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13fd0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
13fe0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
13ff0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
14000 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65  TE_BUSY && pPage
14010 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  r->xBusyHandler(
14020 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
14030 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20  dlerArg) );.    
14040 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14050 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
14060 72 2d 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c  r->state = (u8)l
14070 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
14080 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
14090 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
140a0 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
140b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
140c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
140d0 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
140e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
140f0 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 20 0a  ges specified. .
14100 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  **.** Unless an 
14110 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
14120 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
14130 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
14140 6d 6f 64 69 66 79 20 74 68 65 20 0a 2a 2a 20 64  modify the .** d
14150 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
14160 65 6c 66 2e 20 49 66 20 61 6e 20 65 78 63 6c 75  elf. If an exclu
14170 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  sive lock is not
14180 20 68 65 6c 64 20 77 68 65 6e 20 74 68 69 73 20   held when this 
14190 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
141a0 61 6c 6c 65 64 2c 20 6f 6e 65 20 69 73 20 6f 62  alled, one is ob
141b0 74 61 69 6e 65 64 20 62 65 66 6f 72 65 20 74 72  tained before tr
141c0 75 6e 63 61 74 69 6e 67 20 74 68 65 20 66 69 6c  uncating the fil
141d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
141e0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50  3PagerTruncate(P
141f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
14200 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  no nPage){.  int
14210 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14220 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
14230 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
14240 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 73 71 6c  SHARED );..  sql
14250 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
14260 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  nt(pPager, 0);. 
14270 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
14280 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
14290 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
142a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50  ;.  }else if( nP
142b0 61 67 65 3c 70 50 61 67 65 72 2d 3e 64 62 46 69  age<pPager->dbFi
142c0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 63  leSize ){.    rc
142d0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
142e0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
142f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14300 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
14310 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
14320 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14330 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e  before truncatin
14340 67 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  g. */.      rc =
14350 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
14360 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
14370 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
14380 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
14390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
143a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
143b0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50  ncate(pPager, nP
143c0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
143d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
143e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
143f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14400 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
14410 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
14420 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65  abase file image
14430 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e   to nPage pages.
14440 20 55 6e 6c 69 6b 65 0a 2a 2a 20 73 71 6c 69 74   Unlike.** sqlit
14450 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
14460 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
14470 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c   does not actual
14480 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  ly modify the.**
14490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
144a0 6e 20 64 69 73 6b 2e 20 49 74 20 6a 75 73 74 20  n disk. It just 
144b0 73 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61  sets the interna
144c0 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  l state of the p
144d0 61 67 65 72 0a 2a 2a 20 6f 62 6a 65 63 74 20 73  ager.** object s
144e0 6f 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 63  o that the trunc
144f0 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
14500 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
14510 65 6e 74 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ent .** transact
14520 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
14530 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14540 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
14550 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
14560 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
14570 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14580 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
14590 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
145a0 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
145b0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
145c0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a  Size = nPage;.}.
145d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
145e0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
145f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14600 69 6c 65 20 69 6d 61 67 65 20 69 6e 20 70 61 67  ile image in pag
14610 65 73 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  es. This.** func
14620 74 69 6f 6e 20 64 69 66 66 65 72 73 20 66 72 6f  tion differs fro
14630 6d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  m sqlite3PagerPa
14640 67 65 63 6f 75 6e 74 28 29 20 69 6e 20 74 77 6f  gecount() in two
14650 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 61 29   ways:.**.**  a)
14660 20 49 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20   It may only be 
14670 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 74 20 6c  called when at l
14680 65 61 73 74 20 6f 6e 65 20 72 65 66 65 72 65 6e  east one referen
14690 63 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  ce to a database
146a0 0a 2a 2a 20 20 20 20 20 70 61 67 65 20 69 73 20  .**     page is 
146b0 68 65 6c 64 2e 20 54 68 69 73 20 67 75 61 72 61  held. This guara
146c0 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 20 64  ntees that the d
146d0 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
146e0 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 20 6b  already.**     k
146f0 6e 6f 77 6e 20 61 6e 64 20 61 20 63 61 6c 6c 20  nown and a call 
14700 74 6f 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  to sqlite3OsFile
14710 53 69 7a 65 28 29 20 69 73 20 6e 6f 74 20 72 65  Size() is not re
14720 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 62  quired..**.**  b
14730 29 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  ) The return val
14740 75 65 20 69 73 20 6e 6f 74 20 61 64 6a 75 73 74  ue is not adjust
14750 65 64 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 69  ed for the locki
14760 6e 67 20 70 61 67 65 2e 0a 2a 2f 0a 50 67 6e 6f  ng page..*/.Pgno
14770 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 6d 61   sqlite3PagerIma
14780 67 65 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  geSize(Pager *pP
14790 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
147a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
147b0 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e  alid );.  return
147c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
147d0 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 69 66  .}.#endif  /* if
147e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
147f0 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a  _AUTOVACUUM */..
14800 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
14810 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
14820 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
14830 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
14840 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
14850 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
14860 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
14870 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14880 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
14890 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
148a0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
148b0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
148c0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
148d0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
148e0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
148f0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
14900 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
14910 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
14920 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
14930 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
14940 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
14950 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
14960 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
14970 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
14980 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
14990 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
149a0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
149b0 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
149c0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
149d0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
149e0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
149f0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
14a00 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
14a10 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
14a20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
14a30 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
14a40 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
14a50 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
14a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
14a70 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
14a80 29 7b 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  ){..  disable_si
14a90 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
14aa0 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
14ab0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14ac0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
14ad0 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
14ae0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
14af0 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
14b00 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
14b10 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
14b20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a    /* Set Pager.j
14b30 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20  ournalHdr to -1 
14b40 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74 20  for the benefit 
14b50 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  of the pager_pla
14b60 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20  yback() .    ** 
14b70 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62  call which may b
14b80 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68  e made from with
14b90 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  in pagerUnlockAn
14ba0 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20  dRollback(). If 
14bb0 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  it.    ** is not
14bc0 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e   -1, then the un
14bd0 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
14be0 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  f an open journa
14bf0 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a  l file may.    *
14c00 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  * be played back
14c10 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
14c20 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66  se. If a power f
14c30 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
14c40 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
14c50 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
14c60 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62  e database may b
14c70 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
14c80 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
14c90 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d  ->journalHdr = -
14ca0 31 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  1;.    pagerUnlo
14cb0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
14cc0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 65 6e 61  ager);.  }.  ena
14cd0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
14ce0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
14cf0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
14d00 6c 6f 63 28 29 3b 0a 20 20 50 41 47 45 52 54 52  loc();.  PAGERTR
14d10 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
14d20 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
14d30 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
14d40 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
14d50 50 61 67 65 72 29 29 0a 20 20 69 66 28 20 70 50  Pager)).  if( pP
14d60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
14d70 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
14d80 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
14d90 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
14da0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
14db0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
14dc0 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  nal);.  sqlite3B
14dd0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
14de0 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c  ger->pAlwaysRoll
14df0 62 61 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  back);.  release
14e00 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61  AllSavepoint(pPa
14e10 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  ger);.  sqlite3O
14e20 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
14e30 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69  d);.  /* Temp fi
14e40 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
14e50 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
14e60 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
14e70 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
14e80 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
14e90 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
14ea0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
14eb0 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73    ** }.  */..  s
14ec0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
14ed0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
14ee0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
14ef0 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
14f00 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69  pPCache);.  sqli
14f10 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
14f20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14f30 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
14f40 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
14f50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14f60 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
14f70 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
14f80 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
14f90 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
14fa0 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
14fb0 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
14fc0 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
14fd0 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  p->pgno;.}.#endi
14fe0 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
14ff0 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
15000 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
15010 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f  e.  The input po
15020 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65  inter is.** a re
15030 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
15040 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  age data..*/.int
15050 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
15060 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
15070 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
15080 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
15090 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
150a0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
150b0 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72  urnal.  In other
150c0 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
150d0 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
150e0 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
150f0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
15100 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
15110 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
15120 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
15130 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69  e.** disk.  It i
15140 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f  s not safe to mo
15150 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61  dify the origina
15160 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
15170 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74  until after.** t
15180 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
15190 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20  een synced.  If 
151a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
151b0 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65  abase is modifie
151c0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
151d0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
151e0 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61  d and a power fa
151f0 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68  ilure occurs, th
15200 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e  e unsynced journ
15210 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64  al.** data would
15220 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20   be lost and we 
15230 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20  would be unable 
15240 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f  to completely ro
15250 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61  llback the.** da
15260 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
15270 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
15280 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72  tion would occur
15290 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
152a0 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74  utine also updat
152b0 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  es the nRec fiel
152c0 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  d in the header 
152d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
152e0 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ** (See comments
152f0 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c   on the pager_pl
15300 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
15310 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
15320 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a  information.).**
15330 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64   If the sync mod
15340 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73  e is FULL, two s
15350 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e  yncs will occur.
15360 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c    First the whol
15370 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20  e journal.** is 
15380 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65  synced, then the
15390 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
153a0 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73  pdated, then a s
153b0 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72  econd sync occur
153c0 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
153d0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
153e0 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  , we do not care
153f0 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
15400 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61  to rollback.** a
15410 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  fter a power fai
15420 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63  lure, so no sync
15430 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49   occurs..**.** I
15440 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
15450 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73 20 73  ENTIAL flag is s
15460 65 74 20 66 6f 72 20 74 68 65 20 70 65 72 73 69  et for the persi
15470 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77  stent media on w
15480 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  hich.** the data
15490 62 61 73 65 20 69 73 20 73 74 6f 72 65 64 2c 20  base is stored, 
154a0 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20 69 73  then OsSync() is
154b0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e   never called on
154c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
154d0 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61  file. In this ca
154e0 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  se all that is r
154f0 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 75 70  equired is to up
15500 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69  date the nRec fi
15510 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f  eld in.** the jo
15520 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a  urnal header..**
15530 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15540 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64   clears the need
15550 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76  Sync field of ev
15560 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74  ery page current
15570 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f   held in.** memo
15580 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
15590 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
155a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
155b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
155c0 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  OK;..  /* Sync t
155d0 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
155e0 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
155f0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
15600 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
15610 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
15620 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
15630 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
15640 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
15650 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  eedSync ){.    a
15660 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
15670 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
15680 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
15690 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
156a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
156b0 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  Y ){.      int i
156c0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
156d0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
156e0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
156f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15700 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
15710 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  en );..      if(
15720 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
15730 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
15740 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
15750 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
15760 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
15770 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
15780 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
15790 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
157a0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
157b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
157c0 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
157d0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
157e0 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
157f0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
15800 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
15810 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
15820 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
15830 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
15840 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
15850 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
15860 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
15870 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
15880 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
15890 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
158a0 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
158b0 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
158c0 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
158d0 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
158e0 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
158f0 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
15900 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
15910 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
15920 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
15930 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
15940 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
15950 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
15960 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
15970 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
15980 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
15990 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
159a0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
159b0 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66       i64 jrnlOff
159c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
159d0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
159e0 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
159f0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
15a00 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
15a10 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
15a20 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
15a30 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
15a40 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
15a50 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
15a60 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
15a70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
15a80 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
15a90 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
15aa0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
15ab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
15ac0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
15ad0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
15ae0 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50      jrnlOff = pP
15af0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
15b00 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
15b10 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
15b20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
15b30 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
15b40 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c  pPager, jrnlOff,
15b50 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63   4));.        rc
15b60 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
15b70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
15b80 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  Off, pPager->nRe
15b90 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
15ba0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
15bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15bc0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
15bd0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
15be0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
15bf0 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
15c00 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
15c10 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
15c20 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
15c30 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
15c40 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
15c50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15c60 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
15c70 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
15c80 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
15c90 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
15ca0 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
15cb0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
15cc0 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
15cd0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
15ce0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
15cf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15d00 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
15d10 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
15d20 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
15d30 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
15d40 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
15d50 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
15d60 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
15d70 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
15d80 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
15d90 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
15da0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
15db0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
15dc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
15dd0 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
15de0 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
15df0 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
15e00 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
15e10 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
15e20 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
15e30 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
15e40 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73 20 61 72  ile. No calls ar
15e50 65 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  e made.** to the
15e60 20 70 61 67 65 2d 63 61 63 68 65 20 74 6f 20 6d   page-cache to m
15e70 61 72 6b 20 74 68 65 20 70 61 67 65 73 20 61 73  ark the pages as
15e80 20 63 6c 65 61 6e 2e 20 49 74 20 69 73 20 74 68   clean. It is th
15e90 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
15ea0 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  .** of the calle
15eb0 72 20 74 6f 20 75 73 65 20 50 63 61 63 68 65 43  r to use PcacheC
15ec0 6c 65 61 6e 41 6c 6c 28 29 20 6f 72 20 50 63 61  leanAll() or Pca
15ed0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 74  cheMakeClean() t
15ee0 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68 65 20 70 61  o mark.** the pa
15ef0 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  ges as clean..*/
15f00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15f10 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
15f20 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
15f30 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
15f40 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
15f50 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
15f60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15f70 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
15f80 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
15f90 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
15fa0 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
15fb0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
15fc0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
15fd0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
15fe0 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
15ff0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
16000 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
16010 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
16020 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
16030 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
16040 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
16050 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
16060 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
16070 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
16080 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
16090 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
160a0 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
160b0 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
160c0 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
160d0 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
160e0 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
160f0 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
16100 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
16110 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
16120 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
16130 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
16140 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
16150 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
16160 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
16170 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
16180 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
16190 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
161a0 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
161b0 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
161c0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
161d0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
161e0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
161f0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
16200 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
16210 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
16220 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
16230 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
16240 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
16250 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
16260 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
16270 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
16280 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
16290 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
162a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
162b0 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
162c0 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
162d0 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
162e0 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
162f0 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  ayback..  */.  r
16300 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
16310 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
16320 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
16330 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16340 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
16350 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  n rc;.  }..  whi
16360 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20  le( pList ){..  
16370 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
16380 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
16390 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
163a0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66  t now. */.    if
163b0 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
163c0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
163d0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
163e0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  tempFile);.     
163f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16400 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
16410 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
16420 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
16430 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
16440 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16450 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
16460 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
16470 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
16480 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
16490 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
164a0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
164b0 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
164c0 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
164d0 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63  Truncate() was c
164e0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
164f0 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
16500 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
16510 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
16520 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
16530 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
16540 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
16550 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
16560 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
16570 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
16580 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
16590 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
165a0 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
165b0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
165c0 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
165d0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
165e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72  Size;.      char
165f0 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
16600 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
16610 70 44 61 74 61 2c 20 70 4c 69 73 74 2d 3e 70 67  pData, pList->pg
16620 6e 6f 2c 20 36 29 3b 0a 0a 20 20 20 20 20 20 50  no, 6);..      P
16630 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
16640 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
16650 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
16660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
16670 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
16680 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67  pList->pgno, pag
16690 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
166a0 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
166b0 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
166c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
166d0 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ist->pgno));.   
166e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
166f0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
16700 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
16710 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
16720 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  et);.      PAGER
16730 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
16740 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
16750 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
16760 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
16770 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ite);.      if( 
16780 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
16790 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
167a0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
167b0 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
167c0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
167d0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
167e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
167f0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61   pList->pgno>pPa
16800 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
16810 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
16820 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
16830 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 20 20 20  pList->pgno;.   
16840 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
16850 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
16860 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
16870 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25  RACE(("NOSTORE %
16880 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
16890 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
168a0 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  List->pgno));.  
168b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
168c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
168d0 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
168e0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
168f0 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
16900 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
16910 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
16920 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
16930 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
16940 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16950 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
16960 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
16970 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  e sub-journal. I
16980 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
16990 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
169a0 74 6f 0a 2a 2a 20 75 73 65 20 73 75 62 6a 52 65  to.** use subjRe
169b0 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
169c0 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69 73  check that it is
169d0 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
169e0 20 62 65 66 6f 72 65 20 0a 2a 2a 20 63 61 6c 6c   before .** call
169f0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
16a00 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
16a10 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
16a20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
16a30 6e 74 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a 70  nt rc;.  void *p
16a40 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
16a50 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
16a60 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
16a70 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  ;.  i64 offset =
16a80 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
16a90 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
16aa0 65 53 69 7a 65 29 3b 0a 20 20 63 68 61 72 20 2a  eSize);.  char *
16ab0 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
16ac0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
16ad0 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 0a 20  Pg->pgno, 7);.. 
16ae0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
16af0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
16b00 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
16b10 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
16b20 70 67 6e 6f 29 29 3b 0a 0a 20 20 61 73 73 65 72  pgno));..  asser
16b30 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
16b40 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
16b50 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
16b60 67 53 69 7a 65 20 29 3b 0a 20 20 72 63 20 3d 20  gSize );.  rc = 
16b70 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
16b80 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
16b90 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
16ba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16bb0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
16bc0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
16bd0 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
16be0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
16bf0 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
16c00 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
16c10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
16c20 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b  Pager->stmtNRec+
16c30 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  +;.    assert( p
16c40 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
16c50 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  t>0 );.    rc = 
16c60 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
16c70 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
16c80 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  g->pgno);.  }.  
16c90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
16ca0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
16cb0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
16cc0 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
16cd0 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
16ce0 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
16cf0 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
16d00 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
16d10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70  a pointer to a p
16d20 75 72 67 65 61 62 6c 65 20 50 61 67 65 72 20 0a  urgeable Pager .
16d30 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  ** object. This 
16d40 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
16d50 73 20 74 6f 20 6d 61 6b 65 20 61 20 73 69 6e 67  s to make a sing
16d60 6c 65 20 64 69 72 74 79 20 70 61 67 65 20 74 68  le dirty page th
16d70 61 74 20 68 61 73 20 6e 6f 0a 2a 2a 20 6f 75 74  at has no.** out
16d80 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
16d90 63 65 73 20 28 69 66 20 6f 6e 65 20 65 78 69 73  ces (if one exis
16da0 74 73 29 20 63 6c 65 61 6e 20 73 6f 20 74 68 61  ts) clean so tha
16db0 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 63 79  t it can be recy
16dc0 63 6c 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  cled .** by the 
16dd0 70 63 61 63 68 65 20 6c 61 79 65 72 2e 0a 2a 2f  pcache layer..*/
16de0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16df0 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
16e00 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
16e10 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
16e20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
16e30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16e40 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
16e50 3e 64 6f 4e 6f 74 53 79 6e 63 20 29 7b 0a 20 20  >doNotSync ){.  
16e60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16e70 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  OK;.  }..  asser
16e80 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
16e90 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 69  HDR_DIRTY );.  i
16ea0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
16eb0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de==SQLITE_OK ){
16ec0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  .    if( pPg->fl
16ed0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
16ee0 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20  YNC ){.      rc 
16ef0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
16f00 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
16f10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16f20 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  & pPager->fullSy
16f30 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20 20 21  nc && .        !
16f40 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
16f50 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
16f60 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20  NALMODE_MEMORY) 
16f70 26 26 0a 20 20 20 20 20 20 20 20 21 28 73 71 6c  &&.        !(sql
16f80 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
16f90 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
16fa0 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
16fb0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
16fc0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
16fd0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
16fe0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
16ff0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
17000 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
17010 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
17020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17030 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  {.      pPg->pDi
17040 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  rty = 0;.      i
17050 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  f( pPg->pgno>pPa
17060 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73  ger->dbSize && s
17070 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
17080 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pPg) ){.        
17090 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
170a0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
170b0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
170c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
170d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
170e0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
170f0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
17100 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
17110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17120 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
17130 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d  ager, rc);.    }
17140 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
17150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17160 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
17170 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c  RESS %d page %d\
17180 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
17190 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
171a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
171b0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
171c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
171d0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
171e0 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20  turn 1 if there 
171f0 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
17200 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
17210 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f  ger..** A hot jo
17220 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
17230 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  t needs to be pl
17240 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  ayed back..**.**
17250 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
17260 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
17270 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
17280 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
17290 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
172a0 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
172b0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
172c0 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
172d0 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
172e0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
172f0 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65  me.  Just delete
17300 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
17310 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74  .** Return negat
17320 69 76 65 20 69 66 20 75 6e 61 62 6c 65 20 74 6f  ive if unable to
17330 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
17340 74 61 74 75 73 20 6f 66 20 74 68 65 20 6a 6f 75  tatus of the jou
17350 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
17360 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
17370 74 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  t open the journ
17380 61 6c 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69  al file to exami
17390 6e 65 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  ne its.** conten
173a0 74 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 6a  t.  Hence, the j
173b0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
173c0 74 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  tain the name of
173d0 20 61 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75   a master.** jou
173e0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 68  rnal file that h
173f0 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c  as been deleted,
17400 20 61 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20 62   and hence not b
17410 65 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68  e hot.  Or.** th
17420 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
17430 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 62 65  journal might be
17440 20 7a 65 72 6f 65 64 20 6f 75 74 2e 20 20 54 68   zeroed out.  Th
17450 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f  is routine.** do
17460 65 73 20 6e 6f 74 20 64 69 73 63 6f 76 65 72 20  es not discover 
17470 74 68 65 73 65 20 63 61 73 65 73 20 6f 66 20 61  these cases of a
17480 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c   non-hot journal
17490 20 2d 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75   - if the.** jou
174a0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
174b0 20 61 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70 74   and is not empt
174c0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  y this routine a
174d0 73 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20  ssumes it.** is 
174e0 68 6f 74 2e 20 20 54 68 65 20 70 61 67 65 72 5f  hot.  The pager_
174f0 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
17500 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
17510 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75   that the.** jou
17520 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
17530 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
17540 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  will no-op..*/.s
17550 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
17560 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
17570 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
17580 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
17590 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
175a0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
175b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
175c0 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 30    int exists = 0
175d0 3b 0a 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d  ;.  int locked =
175e0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
175f0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
17600 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
17610 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
17620 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d  ert( pPager->fd-
17630 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 2a  >pMethods );.  *
17640 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 72  pExists = 0;.  r
17650 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
17660 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
17670 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
17680 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
17690 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 69 66  , &exists);.  if
176a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
176b0 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
176c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
176d0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
176e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
176f0 63 6b 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  cked);.  }.  if(
17700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17710 26 20 65 78 69 73 74 73 20 26 26 20 21 6c 6f 63  & exists && !loc
17720 6b 65 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ked ){.    int n
17730 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Page;.    rc = s
17740 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
17750 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
17760 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
17770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17780 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
17790 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
177a0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
177b0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
177c0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  al, 0);.      }e
177d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 45  lse{.        *pE
177e0 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20  xists = 1;.     
177f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
17800 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17810 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
17820 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50 67 20  ent of page pPg 
17830 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
17840 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ase file..*/.sta
17850 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
17860 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
17870 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67  , PgHdr *pPg, Pg
17880 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
17890 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  rc;.  i64 offset
178a0 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44  ;.  assert( MEMD
178b0 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  B==0 );.  assert
178c0 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
178d0 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
178e0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
178f0 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  !pPager->fd->pMe
17900 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74  thods ){.    ret
17910 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
17920 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
17930 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  .  offset = (pgn
17940 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
17950 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63  ->pageSize;.  rc
17960 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
17970 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
17980 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  ->pData, pPager-
17990 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
179a0 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
179b0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
179c0 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
179d0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
179e0 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
179f0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
17a00 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
17a10 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  no));.  if( pgno
17a20 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==1 ){.    memcp
17a30 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
17a40 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 50  eVers, &((u8*)pP
17a50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 2c 0a 20  g->pData)[24],. 
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
17a90 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
17aa0 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20  leVers));.  }.  
17ab0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
17ac0 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e  Pg->pData, pPg->
17ad0 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45  pgno, 3);.  PAGE
17ae0 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
17af0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
17b00 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
17b10 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
17b20 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
17b30 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
17b40 73 68 28 70 50 67 29 29 29 3b 0a 20 20 72 65 74  sh(pPg)));.  ret
17b50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
17b60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17b70 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
17b80 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  ain the shared l
17b90 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66  ock required bef
17ba0 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20  ore.** data may 
17bb0 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
17bc0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
17bd0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
17be0 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
17bf0 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74  been obtained, t
17c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17c10 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
17c20 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
17c30 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73   obtaining the s
17c40 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72  hared lock (if r
17c50 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66  equired), this f
17c60 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b  unction.** check
17c70 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  s for a hot-jour
17c80 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65  nal file. If one
17c90 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d   is found, an em
17ca0 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b  ergency rollback
17cb0 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64  .** is performed
17cc0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f   immediately..*/
17cd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
17ce0 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
17cf0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
17d00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17d10 3b 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52  ;.  int isErrorR
17d20 65 73 65 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  eset = 0;..  /* 
17d30 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
17d40 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 65   is opened for e
17d50 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2c  xclusive access,
17d60 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
17d70 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65 20 72  ing .  ** page r
17d80 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 69 73  eferences and is
17d90 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61   in an error-sta
17da0 74 65 2c 20 6e 6f 77 20 69 73 20 74 68 65 20 63  te, now is the c
17db0 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20  hance to clear. 
17dc0 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44   ** the error. D
17dd0 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
17de0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
17df0 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65 61 74  -cache and treat
17e00 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a   any.  ** open j
17e10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 20 61  ournal file as a
17e20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   hot-journal..  
17e30 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  */.  if( !MEMDB 
17e40 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  && pPager->exclu
17e50 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
17e60 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
17e70 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
17e80 43 61 63 68 65 29 3d 3d 30 20 26 26 20 70 50 61  Cache)==0 && pPa
17e90 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 0a 20 20  ger->errCode .  
17ea0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
17eb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
17ec0 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52  {.      isErrorR
17ed0 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eset = 1;.    }.
17ee0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
17ef0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
17f00 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
17f10 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
17f20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
17f30 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20   is still in an 
17f40 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
17f50 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65  not proceed. The
17f60 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61   error .  ** sta
17f70 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  te will be clear
17f80 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  ed at some point
17f90 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
17fa0 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20  hen all page .  
17fb0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72  ** references ar
17fc0 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68  e dropped and th
17fd0 65 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  e cache can be d
17fe0 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20  iscarded..  */. 
17ff0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
18000 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
18010 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
18020 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
18030 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
18040 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  de;.  }..  if( p
18050 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
18060 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73  GER_UNLOCK || is
18070 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20  ErrorReset ){.  
18080 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
18090 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
180a0 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f  fs;.    int isHo
180b0 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  tJournal = 0;.  
180c0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
180d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
180e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
180f0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
18100 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
18110 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
18120 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
18130 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
18140 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
18150 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
18160 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18180 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18190 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
181a0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  UNLOCK );.      
181b0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
181c0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
181d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
181e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
181f0 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
18200 43 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  CK );.    }..   
18210 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
18220 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
18230 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
18240 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
18250 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
18260 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
18270 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
18280 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
18290 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
182a0 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 45 72  */.    if( !isEr
182b0 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  rorReset ){.    
182c0 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
182d0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73  rnal(pPager, &is
182e0 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  HotJournal);.   
182f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18310 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
18320 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
18330 66 28 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  f( isErrorReset 
18340 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20  || isHotJournal 
18350 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ){.      /* Get 
18360 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
18370 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
18380 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
18390 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
183a0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
183b0 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
183c0 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
183d0 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
183e0 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
183f0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
18400 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
18410 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
18420 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
18430 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
18440 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
18450 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
18460 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
18470 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
18480 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
18490 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
184a0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
184b0 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20  rolling it .    
184c0 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20    ** back..     
184d0 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65   ** .      ** Be
184e0 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
184f0 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
18500 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
18510 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
18520 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65   ** second proce
18530 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74  ss will get to t
18540 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
18550 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
18560 6f 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69  o.      ** obtai
18570 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
18580 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
18590 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
185a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
185b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
185c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
185d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
185e0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
185f0 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
18600 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
18610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18620 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18630 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
18640 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
18650 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
18660 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
18670 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
18680 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
18690 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 7d  CLUSIVE;.      }
186a0 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  . .      /* Open
186b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
186c0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
186d0 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ss. This is beca
186e0 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  use in .      **
186f0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
18700 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
18710 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
18720 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  be kept open and
18730 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62  .      ** possib
18740 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72  ly used for a tr
18750 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20  ansaction later 
18760 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74  on. On some syst
18770 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 2a  ems, the.      *
18780 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63  * OsTruncate() c
18790 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c  all used in excl
187a0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
187b0 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a  e also requires.
187c0 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
187d0 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
187e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
187f0 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65    if( !isErrorRe
18800 73 65 74 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  set && pPager->j
18810 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b  ournalOpen==0 ){
18820 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
18830 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
18840 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
18850 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  Vfs,pPager->zJou
18860 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45  rnal,SQLITE_ACCE
18870 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b  SS_EXISTS,&res);
18880 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
18890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
188a0 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20          if( res 
188b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
188c0 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
188d0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
188e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
188f0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
18900 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
18910 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
18920 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
18930 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
18940 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18950 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
18960 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
18970 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
18980 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
18990 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
189a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
189b0 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
189c0 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ods );.         
189d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
189e0 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
189f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
18a00 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
18a10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
18a20 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ANTOPEN;.       
18a30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
18a40 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
18a50 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
18a60 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
18a70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
18a80 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
18a90 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
18aa0 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f 6d 65   that means some
18ab0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
18ac0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
18ad0 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c 65 64  s already rolled
18ae0 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20 20 20   it back */.    
18af0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
18b00 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
18b10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
18b20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
18b30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18b40 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
18b50 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
18b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
18b70 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
18b80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
18b90 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
18ba0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
18bb0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
18bc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
18bd0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
18be0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
18bf0 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
18c00 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
18c10 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
18c20 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
18c30 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
18c40 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
18c50 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
18c60 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  ead lock..      
18c70 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
18c80 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
18c90 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ger, 1);.      i
18ca0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
18cc0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
18cd0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
18ce0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
18cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
18d00 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
18d10 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
18d20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  || .          (p
18d30 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
18d40 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
18d50 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52  state>PAGER_SHAR
18d60 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ED).      );.   
18d70 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
18d80 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
18d90 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
18da0 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  he)>0 ){.      /
18db0 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
18dc0 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
18dd0 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
18de0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
18df0 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
18e00 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
18e10 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
18e20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
18e30 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
18e40 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
18e50 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
18e60 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
18e70 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
18e80 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
18e90 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
18ea0 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
18eb0 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
18ec0 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
18ed0 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
18ee0 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
18ef0 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
18f00 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
18f10 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
18f20 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
18f30 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
18f40 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
18f50 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
18f60 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
18f70 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
18f80 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
18f90 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
18fa0 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
18fb0 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
18fc0 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
18fd0 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
18fe0 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
18ff0 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
19000 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
19010 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
19020 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
19030 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
19040 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
19050 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
19060 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
19070 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
19080 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
19090 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
190a0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
190b0 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
190c0 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  /.      char dbF
190d0 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
190e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
190f0 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
19100 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
19110 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20  (pPager, 0);..  
19120 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19130 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
19140 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
19150 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
19160 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
19170 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
19180 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
19190 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  izeValid );.    
191a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
191b0 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
191c0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
191d0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
191e0 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
191f0 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
19200 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19210 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
19220 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
19230 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
19240 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
19250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19260 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
19270 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
19280 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
19290 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
192a0 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
192b0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
192c0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
192d0 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
192e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
192f0 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
19300 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
19310 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
19320 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
19330 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
19340 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
19350 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
19360 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
19370 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53  ->state<=PAGER_S
19380 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
19390 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
193a0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
193b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
193c0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
193d0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
193e0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
193f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19400 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     /* pager_unlo
19410 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
19420 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f  for exclusive mo
19430 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79  de and in-memory
19440 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20   databases. */. 
19450 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
19460 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
19470 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19480 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
19490 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  have the content
194a0 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66   for a page.  If
194b0 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a   the page was.**
194c0 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
194d0 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
194e0 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  ent==1, then the
194f0 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20   content was.** 
19500 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64  just initialized
19510 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61   to zeros instea
19520 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20  d of being read 
19530 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75  from disk..** Bu
19540 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68  t now we need th
19550 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20  e real data off 
19560 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b  of disk.  So mak
19570 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76  e sure we.** hav
19580 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69  e it.  Read it i
19590 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68  n if we do not h
195a0 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a  ave it already..
195b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
195c0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
195d0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
195e0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
195f0 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 20 29 7b  HDR_NEED_READ ){
19600 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72 65  .    int rc = re
19610 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e 70 50  adDbPage(pPg->pP
19620 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e  ager, pPg, pPg->
19630 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
19640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19650 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
19660 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
19670 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  READ;.    }else{
19680 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
19690 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
196a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
196b0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
196c0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
196d0 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
196e0 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  , and the pager 
196f0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  is not in the.**
19700 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 77 72 69   middle of a wri
19710 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te transaction o
19720 72 20 6f 70 65 6e 65 64 20 69 6e 20 65 78 63 6c  r opened in excl
19730 75 73 69 76 65 20 6d 6f 64 65 2c 20 75 6e 6c 6f  usive mode, unlo
19740 63 6b 20 69 74 2e 0a 2a 2f 20 0a 73 74 61 74 69  ck it..*/ .stati
19750 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
19760 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
19770 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
19780 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
19790 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
197a0 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20 20  pPCache)==0).   
197b0 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
197c0 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
197d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
197e0 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  f>0) .  ){.    p
197f0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
19800 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
19810 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70   }.}../*.** Drop
19820 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
19830 20 63 61 63 68 65 20 75 73 69 6e 67 20 73 71 6c   cache using sql
19840 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 29  ite3PcacheDrop()
19850 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
19860 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20  means there are 
19870 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20 77 69 74  now no pages wit
19880 68 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  h references to 
19890 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  them, a rollback
198a0 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64 20 74  .** occurs and t
198b0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
198c0 61 74 61 62 61 73 65 20 69 73 20 72 65 6d 6f 76  atabase is remov
198d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
198e0 69 64 20 70 61 67 65 72 44 72 6f 70 50 61 67 65  id pagerDropPage
198f0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
19900 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
19910 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
19920 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
19930 70 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55  p(pPg);.  pagerU
19940 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
19950 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
19960 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
19970 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
19980 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
19990 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
199a0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
199b0 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
199c0 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
199d0 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
199e0 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
199f0 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
19a00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19a10 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
19a20 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
19a30 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
19a40 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
19a50 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
19a60 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
19a70 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
19a80 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
19a90 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
19aa0 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
19ab0 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
19ac0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
19ad0 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
19ae0 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
19af0 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
19b00 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
19b10 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
19b20 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
19b30 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
19b40 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
19b50 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
19b60 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
19b70 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
19b80 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
19b90 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
19ba0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
19bb0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
19bc0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
19bd0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
19be0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
19bf0 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
19c00 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
19c10 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
19c20 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
19c30 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
19c40 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
19c50 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
19c60 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
19c70 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
19c80 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
19c90 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
19ca0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
19cb0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
19cc0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
19cd0 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
19ce0 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
19cf0 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
19d00 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
19d10 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
19d20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
19d30 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
19d40 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
19d50 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
19d60 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
19d70 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
19d80 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
19d90 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
19da0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  iles..**.** If n
19db0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73  oContent is fals
19dc0 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  e, the page cont
19dd0 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ents are actuall
19de0 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  y read from disk
19df0 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  ..** If noConten
19e00 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
19e10 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
19e20 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
19e30 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
19e40 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
19e50 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f  s time, so do no
19e60 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64  t do a disk read
19e70 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
19e80 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
19e90 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20  ent with zeros. 
19ea0 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61   But mark the fa
19eb0 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20  ct that we have 
19ec0 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20  not read the.** 
19ed0 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69  content by setti
19ee0 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
19ef0 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74  dRead flag.  Lat
19f00 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71  er on, if .** sq
19f10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
19f20 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
19f30 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74  his page or if t
19f40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
19f50 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77  * called again w
19f60 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  ith noContent==0
19f70 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
19f80 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  t the content is
19f90 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74   needed.** and t
19fa0 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f  he disk read sho
19fb0 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
19fc0 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  t point..*/.int 
19fd0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
19fe0 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
19ff0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
1a000 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
1a010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a020 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
1a030 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1a040 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
1a050 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
1a060 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
1a070 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
1a080 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
1a090 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
1a0a0 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
1a0b0 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
1a0c0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
1a0d0 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
1a0e0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
1a0f0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   0;.  int rc;.. 
1a100 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a110 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
1a120 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK .       || 
1a130 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
1a140 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
1a150 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20 20  Cache)>0 .      
1a160 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b   || pgno==1.  );
1a170 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
1a180 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
1a190 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
1a1a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
1a1b0 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
1a1c0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
1a1d0 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
1a1e0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
1a1f0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
1a200 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
1a210 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
1a220 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1a230 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
1a240 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1a250 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1a260 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
1a270 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
1a280 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
1a290 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
1a2a0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
1a2b0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a    *ppPage = 0;..
1a2c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1a2d0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
1a2e0 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
1a2f0 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
1a300 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
1a310 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72  base file. pager
1a320 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20  SharedLock() is 
1a330 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a  a no-op if .  **
1a340 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b   a database lock
1a350 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
1a360 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
1a370 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
1a380 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
1a390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a3a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1a3b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a3c0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1a3d0 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20  UNLOCK );..  rc 
1a3e0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
1a3f0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
1a400 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26  ache, pgno, 1, &
1a410 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  pPg);.  if( rc!=
1a420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a430 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1a440 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65    if( pPg->pPage
1a450 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  r==0 ){.    /* T
1a460 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
1a470 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
1a480 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
1a490 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
1a4a0 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
1a4b0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1a4c0 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47  nt nMax;.    PAG
1a4d0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1a4e0 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 2d  nMiss);.    pPg-
1a4f0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
1a500 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  ;.    memset(pPg
1a510 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61  ->pExtra, 0, pPa
1a520 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 0a 20  ger->nExtra);.. 
1a530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1a540 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1a550 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20  ager, &nMax);.  
1a560 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a570 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1a580 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1a590 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Pg);.      retur
1a5a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1a5b0 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
1a5c0 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
1a5d0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
1a5e0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
1a5f0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
1a600 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1a610 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1a620 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1a630 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ITE_FULL;.      
1a640 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
1a650 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
1a660 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1a670 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
1a680 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
1a690 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
1a6a0 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
1a6b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
1a6c0 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
1a6d0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1a6e0 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
1a6f0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
1a700 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  DbPage(pPager, p
1a710 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg, pgno);.     
1a720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a730 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
1a740 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1a750 44 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  D ){.        /* 
1a760 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1a770 66 28 70 50 67 29 3b 20 2a 2f 0a 20 20 20 20 20  f(pPg); */.     
1a780 20 20 20 70 61 67 65 72 44 72 6f 70 50 61 67 65     pagerDropPage
1a790 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
1a7a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1a7b0 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  }.    }.#ifdef S
1a7c0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1a7d0 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
1a7e0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1a7f0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1a800 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
1a810 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1a820 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
1a830 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
1a840 20 20 61 73 73 65 72 74 28 73 71 6c 69 74 65 33    assert(sqlite3
1a850 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
1a860 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
1a870 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20  0 || pgno==1);. 
1a880 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
1a890 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20  ager->nHit);.   
1a8a0 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20   if( !noContent 
1a8b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1a8c0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
1a8d0 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pPg);.      if( 
1a8e0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rc ){.        sq
1a8f0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1a900 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pPg);.        re
1a910 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1a920 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
1a930 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72  pPage = pPg;.  r
1a940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
1a960 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69  e a page if it i
1a970 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
1a980 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
1a990 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61  .  Do.** not rea
1a9a0 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  d the page from 
1a9b0 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20  disk.  Return a 
1a9c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
1a9d0 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20  age,.** or 0 if 
1a9e0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1a9f0 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  in cache..**.** 
1aa00 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
1aa10 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
1aa20 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1aa30 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
1aa40 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
1aa50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
1aa60 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
1aa70 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
1aa80 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
1aa90 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
1aaa0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1aab0 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
1aac0 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
1aad0 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
1aae0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
1aaf0 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
1ab00 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
1ab10 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
1ab20 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
1ab30 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1ab40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1ab50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
1ab60 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61  dr *pPg = 0;.  a
1ab70 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1ab80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
1ab90 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  no!=0 );..  if( 
1aba0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d  (pPager->state!=
1abb0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20  PAGER_UNLOCK).  
1abc0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 72 72   && (pPager->err
1abd0 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
1abe0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
1abf0 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  de==SQLITE_FULL)
1ac00 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
1ac10 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
1ac20 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
1ac30 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
1ac40 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  }..  return pPg;
1ac50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
1ac60 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
1ac70 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
1ac80 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1ac90 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
1aca0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
1acb0 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
1acc0 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
1acd0 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
1ace0 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
1acf0 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
1ad00 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
1ad10 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
1ad20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1ad30 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
1ad40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ad50 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
1ad60 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
1ad70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  Pg ){.    Pager 
1ad80 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1ad90 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
1ada0 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
1adb0 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55  pPg);.    pagerU
1adc0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
1add0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
1ade0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1adf0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  ..static int ope
1ae00 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65  nSubJournal(Page
1ae10 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1ae20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ae30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1ae40 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 21  journalOpen && !
1ae50 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d 3e 70 4d  pPager->sjfd->pM
1ae60 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 66  ethods ){.    if
1ae70 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1ae80 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
1ae90 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
1aea0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1aeb0 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
1aec0 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
1aed0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1aee0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1aef0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
1af00 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
1af10 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
1af20 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
1af30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1af40 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1af50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1af60 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
1af70 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
1af80 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
1af90 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
1afa0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1afb0 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
1afc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1afd0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
1afe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
1aff0 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
1b000 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
1b010 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
1b020 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
1b030 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
1b040 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
1b050 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
1b060 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
1b070 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1b080 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1b090 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
1b0a0 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
1b0b0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1b0c0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43  |SQLITE_OPEN_EXC
1b0d0 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
1b0e0 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69  EN_CREATE);..  i
1b0f0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1b100 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1b110 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1b120 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1b130 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
1b140 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1b150 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
1b160 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  0 );.  sqlite3Pa
1b170 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1b180 67 65 72 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  ger, 0);.  pPage
1b190 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
1b1a0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
1b1b0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
1b1c0 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ze);.  if( pPage
1b1d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
1b1e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1b1f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
1b200 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1b210 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1b220 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
1b230 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b  ournalOpen==0 ){
1b240 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1b250 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
1b260 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
1b270 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1b280 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
1b290 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
1b2a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b2b0 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
1b2c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1b2d0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
1b2e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1b2f0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
1b300 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
1b310 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ORY ){.      sql
1b320 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
1b330 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
1b340 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1b350 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1b360 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1b370 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
1b380 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ITE.      rc = s
1b390 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
1b3a0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 56 66  n(.          pVf
1b3b0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1b3c0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
1b3d0 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
1b3e0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
1b3f0 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20        );.#else. 
1b400 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b410 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
1b420 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1b430 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
1b440 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  gs, 0);.#endif. 
1b450 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1b460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1b470 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
1b480 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 70  Methods );.    p
1b490 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b4a0 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
1b4b0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
1b4c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
1b4d0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
1b4e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b4f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1b500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
1b510 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  M ){.        sql
1b520 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
1b530 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1b540 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
1b550 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
1b560 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1b570 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  al;.    }.  }.  
1b580 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b590 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
1b5a0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1b5b0 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
1b5c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1b5d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
1b5e0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
1b5f0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1b600 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
1b610 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
1b620 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
1b630 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
1b640 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
1b650 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1b660 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
1b670 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1b680 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1b690 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->nSavepoint && 
1b6a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b6b0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
1b6c0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
1b6d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
1b6e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1b6f0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
1b700 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
1b710 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72  R_NOMEM ){.    r
1b720 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1b730 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1b740 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1b750 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b760 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b770 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
1b780 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
1b790 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
1b7a0 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33  urnal:.  sqlite3
1b7b0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
1b7c0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1b7d0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
1b7e0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
1b7f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b800 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
1b810 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
1b820 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
1b830 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
1b840 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
1b850 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
1b860 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
1b870 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f    sqlite3PagerCo
1b880 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69  mmitPhaseTwo() i
1b890 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
1b8a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
1b8b0 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
1b8c0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1b8d0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20  te3PagerClose() 
1b8e0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
1b8f0 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  *  sqlite3PagerU
1b900 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
1b910 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
1b920 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
1b930 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
1b940 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
1b950 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
1b960 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
1b970 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
1b980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b990 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
1b9a0 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
1b9b0 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
1b9c0 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
1b9d0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
1b9e0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1b9f0 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
1ba00 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
1ba10 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1ba20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1ba30 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
1ba40 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1ba50 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
1ba60 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
1ba70 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
1ba80 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
1ba90 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
1baa0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1bab0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
1bac0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
1bad0 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
1bae0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
1baf0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
1bb00 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
1bb10 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
1bb20 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
1bb30 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
1bb40 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
1bb50 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
1bb60 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
1bb70 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
1bb80 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1bb90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1bba0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
1bbb0 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
1bbc0 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
1bbd0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1bbe0 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
1bbf0 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
1bc00 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
1bc10 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1bc20 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
1bc30 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
1bc40 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
1bc50 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
1bc60 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
1bc70 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
1bc80 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
1bc90 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
1bca0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
1bcb0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1bcc0 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  (DbPage *pPg, in
1bcd0 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67  t exFlag){.  Pag
1bce0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1bcf0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1bd00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bd10 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1bd20 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
1bd30 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1bd40 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1bd50 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1bd60 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1bd70 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
1bd80 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
1bd90 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1bda0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
1bdb0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1bdc0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1bdd0 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
1bde0 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  CK);.    if( rc=
1bdf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1be00 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1be10 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
1be20 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78  ED;.      if( ex
1be30 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1be40 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1be50 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1be60 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1be70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1be80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1be90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1bea0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1beb0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1bec0 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 50  Cache = 0;.    P
1bed0 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
1bee0 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
1bef0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1bf00 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1bf10 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
1bf20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1bf30 65 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  e.           && 
1bf40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1bf50 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
1bf60 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
1bf70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
1bf80 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
1bf90 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  er);.    }.  }el
1bfa0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1bfb0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1bfc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1bfd0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1bfe0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1bff0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
1c000 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1c010 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a  s mode the last.
1c020 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72      ** time a (r
1c030 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72  ead or write) tr
1c040 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75  ansaction was su
1c050 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c  ccessfully concl
1c060 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  uded.    ** by t
1c070 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  his connection. 
1c080 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74  Instead of delet
1c090 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
1c0a0 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20  file it was .   
1c0b0 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e   ** kept open an
1c0c0 64 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75  d either was tru
1c0d0 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65  ncated to 0 byte
1c0e0 73 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20  s or its header 
1c0f0 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77  was.    ** overw
1c100 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f  ritten with zero
1c110 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
1c120 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
1c130 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
1c140 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
1c150 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  rigSize==0 );.  
1c160 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c170 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
1c180 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
1c190 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1c1a0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 50 61  ger, 0);.    pPa
1c1b0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
1c1c0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
1c1d0 72 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64  reate( pPager->d
1c1e0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  bSize );.    if(
1c1f0 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
1c200 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
1c210 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1c220 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c230 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
1c240 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1c250 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20  bSize;.      rc 
1c260 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1c270 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
1c280 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
1c290 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c2a0 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  pen || pPager->j
1c2b0 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72  ournalOff>0 || r
1c2c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1c2d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c2e0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
1c2f0 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
1c300 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
1c310 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1c320 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
1c330 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
1c340 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
1c350 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
1c360 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
1c370 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
1c380 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
1c390 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
1c3a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c3b0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
1c3c0 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
1c3d0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
1c3e0 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52  acquires a RESER
1c3f0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
1c400 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
1c410 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  e RESERVED.** lo
1c420 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
1c430 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72  acquired, this r
1c440 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1c450 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65  QLITE_BUSY.  The
1c460 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
1c470 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66  ine must check f
1c480 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76  or that return v
1c490 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65  alue and be care
1c4a0 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68  ful not to.** ch
1c4b0 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
1c4c0 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f  ta until this ro
1c4d0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
1c4e0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
1c4f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1c500 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
1c510 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20  written because 
1c520 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c  the disk is full
1c530 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
1c540 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1c550 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64  QLITE_FULL and d
1c560 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  oes an immediate
1c570 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c   rollback..** Al
1c580 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69  l subsequent wri
1c590 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f  te attempts also
1c5a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1c5b0 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a  ULL until there.
1c5c0 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20  ** is a call to 
1c5d0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1c5e0 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50  it() or sqlite3P
1c5f0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74  agerRollback() t
1c600 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73  o.** reset..*/.s
1c610 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1c620 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
1c630 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
1c640 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
1c650 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c660 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1c670 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c680 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
1c690 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
1c6a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1c6b0 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
1c6c0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1c6d0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
1c6e0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
1c6f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c700 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
1c710 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1c720 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
1c730 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
1c740 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
1c750 69 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76  is page was prev
1c760 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20  iously acquired 
1c770 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
1c780 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  1, that means.  
1c790 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61  ** we didn't rea
1c7a0 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20  lly read in the 
1c7b0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
1c7c0 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68  age.  This can h
1c7d0 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20  appen.  ** (for 
1c7e0 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68  example) when th
1c7f0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
1c800 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
1c810 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a  elist.  But.  **
1c820 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72   now we are (per
1c830 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65  haps) moving the
1c840 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65   page off of the
1c850 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20   freelist for.  
1c860 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20  ** reuse and we 
1c870 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73  need to know its
1c880 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
1c890 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e  t so that conten
1c8a0 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74  t.  ** can be st
1c8b0 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ored in the roll
1c8c0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53  back journal.  S
1c8d0 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74  o do the read at
1c8e0 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e   this.  ** time.
1c8f0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
1c900 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
1c910 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  Pg);.  if( rc ){
1c920 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c930 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
1c940 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
1c950 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
1c960 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1c970 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
1c980 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
1c990 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
1c9a0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
1c9b0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
1c9c0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
1c9d0 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e   if( pageInJourn
1c9e0 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a  al(pPg) && !subj
1c9f0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
1ca00 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
1ca10 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1ca20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
1ca30 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d  odified = 1;.  }
1ca40 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  else{..    /* If
1ca50 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
1ca60 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1ca70 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
1ca80 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  o be.    ** writ
1ca90 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73  ten to the trans
1caa0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f  action journal o
1cab0 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74  r the ckeckpoint
1cac0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1cad0 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a  or both..    **.
1cae0 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65      ** First che
1caf0 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74  ck to see that t
1cb00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1cb10 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e  ournal exists an
1cb20 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20  d.    ** create 
1cb30 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  it if it does no
1cb40 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
1cb50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1cb60 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1cb70 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  K );.    rc = sq
1cb80 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1cb90 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  pPg, 0);.    if(
1cba0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cbb0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1cbc0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
1cbd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1cbe0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1cbf0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
1cc00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1cc10 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
1cc20 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  eJournal.       
1cc30 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
1cc40 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
1cc50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
1cc60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1cc70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1cc80 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1cc90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cca0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1ccb0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1ccc0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
1ccd0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
1cce0 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20  Modified = 1;.  
1ccf0 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
1cd00 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1cd10 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
1cd20 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
1cd30 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
1cd40 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1cd50 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1cd60 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
1cd70 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1cd80 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
1cd90 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1cda0 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
1cdb0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
1cdc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
1cdd0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
1cde0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
1cdf0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
1ce00 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
1ce10 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
1ce20 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ize ){.        u
1ce30 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
1ce40 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
1ce50 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
1ce60 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
1ce70 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1ce80 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
1ce90 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
1cea0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
1ceb0 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
1cec0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1ced0 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
1cee0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
1cef0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
1cf00 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
1cf10 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
1cf20 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
1cf30 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f       pData2 = CO
1cf40 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
1cf50 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
1cf60 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
1cf70 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
1cf80 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
1cf90 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  a2);.        rc 
1cfa0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
1cfb0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1cfc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
1cfd0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1cfe0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1d010 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
1d020 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
1d030 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d050 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1d060 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20  r->journalOff + 
1d070 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  4);.          pP
1d080 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d090 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
1d0a0 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20  Size+4;.        
1d0b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1d0c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d0d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
1d0e0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1d0f0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
1d100 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
1d110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
1d120 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1d130 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
1d140 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1d150 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
1d160 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
1d170 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
1d180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1d190 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d1a0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1d1b0 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
1d1c0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1d1d0 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
1d1e0 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
1d1f0 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
1d200 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
1d210 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
1d220 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1d230 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1d240 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1d250 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1d260 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
1d270 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
1d280 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
1d290 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20  sh(pPg)));..    
1d2a0 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
1d2b0 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
1d2c0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
1d2d0 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  while journallin
1d2e0 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  g the.        **
1d2f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f   page in the blo
1d300 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68  ck above, set th
1d310 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67  e need-sync flag
1d320 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20   for the page.. 
1d330 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77         ** Otherw
1d340 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
1d350 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1d360 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
1d370 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  gic in.        *
1d380 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
1d390 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
1d3a0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
1d3b0 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
1d3c0 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
1d3d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1d3e0 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
1d3f0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
1d400 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
1d410 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63         ** then c
1d420 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
1d430 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f  llow..        */
1d440 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
1d450 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
1d460 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66            pPg->f
1d470 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
1d480 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20  ED_SYNC;.       
1d490 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1d4a0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
1d4b0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   }..        /* A
1d4c0 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
1d4d0 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
1d4e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1d4f0 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
1d500 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
1d510 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
1d520 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
1d530 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
1d540 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1d550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d560 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1d570 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1d580 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1d590 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
1d5a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
1d5b0 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
1d5c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d5d0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
1d5e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
1d5f0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1d600 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1d610 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
1d620 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1d630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d640 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
1d650 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  MEM );.        r
1d660 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  c |= addToSavepo
1d670 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
1d680 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
1d690 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1d6a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d6b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
1d6c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
1d6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1d6e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1d6f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d700 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1d710 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1d720 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
1d730 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
1d740 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
1d750 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
1d760 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1d770 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1d780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d790 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1d7a0 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
1d7b0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1d7c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d7d0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1d7e0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
1d800 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d810 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
1d820 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d830 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
1d840 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1d850 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
1d860 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1d870 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
1d880 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
1d890 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
1d8a0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1d8b0 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
1d8c0 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
1d8d0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
1d8e0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
1d8f0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
1d900 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
1d910 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
1d920 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
1d930 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
1d940 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d950 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
1d960 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20  e(pPg) ){.      
1d970 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
1d980 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  age(pPg);.    }.
1d990 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
1d9a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1d9b0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
1d9c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1d9d0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1d9e0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
1d9f0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1da00 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
1da10 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1da20 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
1da30 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
1da40 62 53 69 7a 65 3d 3d 28 50 41 47 45 52 5f 4d 4a  bSize==(PAGER_MJ
1da50 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 2d 31 29  _PGNO(pPager)-1)
1da60 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1da70 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
1da80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1da90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1daa0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1dab0 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61  d to mark a data
1dac0 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c  -page as writabl
1dad0 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70  e. It uses .** p
1dae0 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20  ager_write() to 
1daf0 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
1db00 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ile (if it is no
1db10 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a  t already open).
1db20 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  ** and write the
1db30 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20   page *pData to 
1db40 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1db50 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
1db60 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
1db70 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
1db80 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
1db90 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
1dba0 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
1dbb0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
1dbc0 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
1dbd0 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
1dbe0 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
1dbf0 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
1dc00 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
1dc10 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
1dc20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
1dc30 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1dc40 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
1dc50 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1dc60 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1dc70 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
1dc80 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
1dc90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1dca0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
1dcb0 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
1dcc0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1dcd0 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
1dce0 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
1dcf0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1dd00 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
1dd10 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ze);..  if( nPag
1dd20 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
1dd30 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
1dd40 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
1dd50 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1dd60 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1dd70 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
1dd80 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
1dd90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1dda0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
1ddb0 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
1ddc0 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
1ddd0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
1dde0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ddf0 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
1de00 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
1de10 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
1de20 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65  t ii;.    int ne
1de30 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
1de40 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
1de50 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
1de60 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1de70 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
1de80 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
1de90 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
1dea0 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
1deb0 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
1dec0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1ded0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1dee0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
1def0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1df00 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
1df10 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
1df20 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b  ->doNotSync = 1;
1df30 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
1df40 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
1df50 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
1df60 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
1df70 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
1df80 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
1df90 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
1dfa0 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
1dfb0 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
1dfc0 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
1dfd0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
1dfe0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
1dff0 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
1e000 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
1e010 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
1e020 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
1e030 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50  1;..    sqlite3P
1e040 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1e050 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50  ager, (int *)&nP
1e060 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69  ageCount);.    i
1e070 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
1e080 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
1e090 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
1e0a0 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
1e0b0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
1e0c0 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
1e0d0 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
1e0e0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
1e0f0 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
1e100 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e110 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
1e120 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
1e130 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
1e140 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
1e150 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
1e160 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
1e170 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
1e180 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
1e190 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
1e1a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
1e1b0 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
1e1c0 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
1e1d0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
1e1e0 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70  .      if( pg==p
1e1f0 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c  Pg->pgno || !sql
1e200 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
1e210 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1e220 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20  l, pg) ){.      
1e230 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
1e240 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1e250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1e260 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1e270 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
1e280 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e290 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e2a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e2b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
1e2c0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
1e2d0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1e2e0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1e2f0 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
1e300 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
1e310 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
1e320 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
1e330 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
1e340 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e350 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e360 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
1e370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1e380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e390 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
1e3a0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1e3b0 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
1e3c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
1e3d0 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
1e3e0 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
1e3f0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
1e400 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
1e410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1e420 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1e430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e440 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
1e450 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
1e460 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
1e470 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
1e480 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
1e490 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
1e4a0 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
1e4b0 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
1e4c0 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
1e4d0 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
1e4e0 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
1e4f0 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
1e500 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
1e510 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
1e520 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
1e530 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
1e540 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
1e550 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
1e560 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
1e570 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
1e580 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1e590 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
1e5a0 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
1e5b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1e5c0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1e5d0 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
1e5e0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1e5f0 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64  ii<nPage && need
1e600 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Sync; ii++){.   
1e610 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
1e620 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
1e630 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
1e640 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
1e650 61 67 65 20 29 20 70 50 61 67 65 2d 3e 66 6c 61  age ) pPage->fla
1e660 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
1e670 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 73  _SYNC;.        s
1e680 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e690 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
1e6a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
1e6b0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b  ager->needSync);
1e6c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
1e6d0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
1e6e0 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  tSync==1 );.    
1e6f0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1e700 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
1e710 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1e720 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
1e730 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e740 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e750 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
1e760 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1e770 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
1e780 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
1e790 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
1e7a0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
1e7b0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
1e7c0 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
1e7d0 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
1e7e0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1e7f0 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65   page..*/.#ifnde
1e800 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  f NDEBUG.int sql
1e810 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1e820 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67  able(DbPage *pPg
1e830 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  ){.  return pPg-
1e840 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1e850 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TY;.}.#endif../*
1e860 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1e870 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1e880 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1e890 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
1e8a0 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20  ary to.** write 
1e8b0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1e8c0 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b  on page pPg back
1e8d0 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
1e8e0 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
1e8f0 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
1e900 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1e910 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
1e920 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
1e930 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61  n.** the page ha
1e940 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20  s been added as 
1e950 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72  a leaf of the fr
1e960 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74  eelist and so it
1e970 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20  s.** content no 
1e980 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a  longer matters..
1e990 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
1e9a0 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
1e9b0 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
1e9c0 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
1e9d0 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
1e9e0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1e9f0 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
1ea00 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
1ea10 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
1ea20 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
1ea30 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
1ea40 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1ea50 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
1ea60 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1ea70 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
1ea80 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
1ea90 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1eaa0 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
1eab0 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
1eac0 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
1ead0 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
1eae0 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
1eaf0 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
1eb00 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
1eb10 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1eb20 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1eb30 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
1eb40 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
1eb50 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
1eb60 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
1eb70 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1eb80 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
1eb90 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
1eba0 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
1ebb0 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
1ebc0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
1ebd0 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
1ebe0 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
1ebf0 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
1ec00 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1ec10 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
1ec20 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
1ec30 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
1ec40 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
1ec50 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
1ec60 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
1ec70 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
1ec80 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
1ec90 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1eca0 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
1ecb0 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
1ecc0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1ecd0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1ece0 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
1ecf0 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73  reused,.** the s
1ed00 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1ed10 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1ed20 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1ed30 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  t because the.**
1ed40 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63   page contains c
1ed50 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1ed60 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1ed70 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a  e sure it gets.*
1ed80 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  * rolled back in
1ed90 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71   spite of the sq
1eda0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1edb0 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
1edc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1edd0 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
1ede0 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
1edf0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1ee00 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1ee10 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1ee20 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
1ee30 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1ee40 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1ee50 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
1ee60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ee70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
1ee80 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3d 3d 30  lwaysRollback==0
1ee90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1eea0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1eeb0 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
1eec0 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
1eed0 6b 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  k = sqlite3Bitve
1eee0 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
1eef0 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 20  dbOrigSize);.   
1ef00 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 41   if( !pPager->pA
1ef10 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
1ef20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ef30 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1ef40 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  }.  }.  rc = sql
1ef50 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
1ef60 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
1ef70 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f  lback, pPg->pgno
1ef80 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1ef90 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 67 2d  LITE_OK && (pPg-
1efa0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1efb0 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  TY) && pPager->n
1efc0 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a  Savepoint==0 ){.
1efd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1efe0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1eff0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1f000 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1f010 65 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  e==pPg->pgno && 
1f020 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1f030 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
1f040 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
1f050 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
1f060 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1f070 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
1f080 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
1f090 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
1f0a0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1f0b0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
1f0c0 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
1f0d0 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
1f0e0 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
1f0f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
1f100 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
1f110 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
1f120 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
1f130 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
1f140 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
1f150 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
1f160 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
1f170 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
1f180 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
1f190 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
1f1a0 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
1f1b0 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
1f1c0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
1f1d0 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
1f1e0 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
1f1f0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
1f200 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
1f210 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
1f220 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
1f230 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1f240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f250 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e  PAGERTRACE(("DON
1f260 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
1f270 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
1f280 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1f290 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 49 4f  ger)));.      IO
1f2a0 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70  TRACE(("CLEAN %p
1f2b0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1f2c0 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  pPg->pgno)).    
1f2d0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
1f2e0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1f2f0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
1f300 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1f310 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
1f320 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
1f330 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
1f340 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1f350 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
1f360 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1f370 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1f380 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
1f390 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
1f3a0 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
1f3b0 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
1f3c0 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
1f3d0 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
1f3e0 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
1f3f0 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
1f400 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
1f410 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
1f420 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
1f430 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
1f440 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20  *.** If we have 
1f450 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79  not yet actually
1f460 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
1f470 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28  t of this page (
1f480 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e  if.** the PgHdr.
1f490 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73  needRead flag is
1f4a0 20 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20   set) then this 
1f4b0 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20  routine acts as 
1f4c0 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61  a promise.** tha
1f4d0 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  t we will never 
1f4e0 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  need to read the
1f4f0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e   page content in
1f500 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20   the future..** 
1f510 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20  so the needRead 
1f520 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61  flag can be clea
1f530 72 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  red at this poin
1f540 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1f550 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1f560 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29  ack(DbPage *pPg)
1f570 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1f580 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1f590 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74  .  TESTONLY( int
1f5a0 20 72 63 3b 20 29 20 20 2f 2a 20 52 65 74 75 72   rc; )  /* Retur
1f5b0 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c  n value from sql
1f5c0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 29 20  ite3BitvecSet() 
1f5d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1f5e0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1f5f0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 0a  ER_RESERVED );..
1f600 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
1f610 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1f620 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72 69  open, or DontWri
1f630 74 65 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  te() has been ca
1f640 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 69  lled on.  ** thi
1f650 73 20 70 61 67 65 20 28 44 6f 6e 74 57 72 69 74  s page (DontWrit
1f660 65 28 29 20 73 65 74 73 20 74 68 65 20 61 6c 77  e() sets the alw
1f670 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
1f680 29 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a  ), then this.  *
1f690 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
1f6a0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1f6b0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1f6c0 6c 4f 70 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20  lOpen==0 .   || 
1f6d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
1f6e0 74 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  t(pPager->pAlway
1f6f0 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e  sRollback, pPg->
1f700 70 67 6e 6f 29 0a 20 20 20 7c 7c 20 70 50 67 2d  pgno).   || pPg-
1f710 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
1f720 4f 72 69 67 53 69 7a 65 0a 20 20 29 7b 0a 20 20  OrigSize.  ){.  
1f730 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 23    return;.  }..#
1f740 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
1f750 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66 28  URE_DELETE.  if(
1f760 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
1f770 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
1f780 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
1f790 29 21 3d 30 0a 20 20 20 7c 7c 20 70 50 67 2d 3e  )!=0.   || pPg->
1f7a0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
1f7b0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  rigSize ){.    r
1f7c0 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
1f7d0 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55 52  f..  /* If SECUR
1f7e0 45 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73 61  E_DELETE is disa
1f7f0 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65  bled, then there
1f800 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
1f810 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  this.  ** routin
1f820 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
1f830 6f 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77 68  on a page for wh
1f840 69 63 68 20 73 71 6c 69 74 65 33 50 61 67 65 72  ich sqlite3Pager
1f850 44 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a 2a  DontWrite().  **
1f860 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72   has not been pr
1f870 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20  eviously called 
1f880 64 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20  during the same 
1f890 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
1f8a0 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72 69  * And if DontWri
1f8b0 74 65 28 29 20 68 61 73 20 70 72 65 76 69 6f 75  te() has previou
1f8c0 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  sly been called,
1f8d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
1f8e0 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d   ** conditions m
1f8f0 75 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2a  ust be met..  **
1f900 0a 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29 20 20  .  ** (Later:)  
1f910 4e 6f 74 20 74 72 75 65 2e 20 20 49 66 20 74 68  Not true.  If th
1f920 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
1f930 72 72 75 70 74 65 64 20 62 79 20 68 61 76 69 6e  rrupted by havin
1f940 67 20 64 75 70 6c 69 63 61 74 65 0a 20 20 2a 2a  g duplicate.  **
1f950 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1f960 65 65 6c 69 73 74 20 28 65 78 3a 20 63 6f 72 72  eelist (ex: corr
1f970 75 70 74 39 2e 74 65 73 74 29 20 74 68 65 6e 20  upt9.test) then 
1f980 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1f990 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73   not.  ** necess
1f9a0 61 72 69 6c 79 20 74 72 75 65 3a 0a 20 20 2a 2f  arily true:.  */
1f9b0 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70  .  /* assert( !p
1f9c0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
1f9d0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
1f9e0 3c 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  <= pPager->dbOri
1f9f0 67 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20 61  gSize ); */..  a
1fa00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1fa10 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1fa20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
1fa30 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
1fa40 3b 0a 0a 20 20 2f 2a 20 46 61 69 6c 75 72 65 20  ;..  /* Failure 
1fa50 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
1fa60 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
1fa70 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
1fa80 62 65 6e 69 67 6e 2e 0a 20 20 2a 2a 20 49 74 20  benign..  ** It 
1fa90 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61  merely means tha
1faa0 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f  t we might do so
1fab0 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f  me extra work to
1fac0 20 6a 6f 75 72 6e 61 6c 20 61 20 70 61 67 65 0a   journal a page.
1fad0 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
1fae0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
1faf0 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
1fb00 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
1fb10 74 6f 20 74 65 73 74 20 74 68 65 0a 20 20 2a 2a  to test the.  **
1fb20 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61   case where a ma
1fb30 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72  lloc error occur
1fb40 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
1fb50 6f 20 73 65 74 20 61 20 62 69 74 20 69 6e 20 61  o set a bit in a
1fb60 20 0a 20 20 2a 2a 20 62 69 74 20 76 65 63 74 6f   .  ** bit vecto
1fb70 72 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  r..  */.  sqlite
1fb80 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1fb90 6f 63 28 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  oc();.  TESTONLY
1fba0 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33  ( rc = ) sqlite3
1fbb0 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
1fbc0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
1fbd0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74  g->pgno);.  test
1fbe0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
1fbf0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 54 45 53 54  _NOMEM );.  TEST
1fc00 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
1fc10 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
1fc20 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
1fc30 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73  pgno);.  testcas
1fc40 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
1fc50 4d 45 4d 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  MEM );.  sqlite3
1fc60 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
1fc70 29 3b 0a 0a 0a 20 20 50 41 47 45 52 54 52 41 43  );...  PAGERTRAC
1fc80 45 28 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E(("DONT_ROLLBAC
1fc90 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
1fca0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
1fcb0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1fcc0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47 41  ;.  IOTRACE(("GA
1fcd0 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20  RBAGE %p %d\n", 
1fce0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1fcf0 6f 29 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  o)).}.../*.** Th
1fd00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1fd10 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
1fd20 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1fd30 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
1fd40 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74  er,.** stored at
1fd50 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20   byte 24 of the 
1fd60 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pager file..*/.s
1fd70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1fd80 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1fd90 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1fda0 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b  , int isDirect){
1fdb0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72  .  PgHdr *pPgHdr
1fdc0 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  ;.  u32 change_c
1fdd0 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63  ounter;.  int rc
1fde0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
1fdf0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
1fe00 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
1fe10 45 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69  E.  assert( isDi
1fe20 72 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 69  rect==0 );  /* i
1fe30 73 44 69 72 65 63 74 20 69 73 20 6f 6e 6c 79 20  sDirect is only 
1fe40 74 72 75 65 20 66 6f 72 20 61 74 6f 6d 69 63 20  true for atomic 
1fe50 77 72 69 74 65 73 20 2a 2f 0a 23 65 6e 64 69 66  writes */.#endif
1fe60 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1fe70 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
1fe80 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
1fe90 65 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  e>0 ){.    /* Op
1fea0 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
1feb0 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
1fec0 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
1fed0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1fee0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
1fef0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1ff00 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1ff10 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20  rn rc;..    if( 
1ff20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20  !isDirect ){.   
1ff30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ff40 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
1ff50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1ff60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ff70 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1ff80 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
1ff90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ffa0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1ffb0 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
1ffc0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1ffd0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1ffe0 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1fff0 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61  e 24. */.    cha
20000 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
20010 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
20020 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  8*)pPager->dbFil
20030 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e  eVers);.    chan
20040 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
20050 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
20060 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
20070 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
20080 75 6e 74 65 72 29 3b 0a 0a 23 69 66 64 65 66 20  unter);..#ifdef 
20090 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
200a0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69  OMIC_WRITE.    i
200b0 66 28 20 69 73 44 69 72 65 63 74 20 26 26 20 70  f( isDirect && p
200c0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
200d0 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  ods ){.      con
200e0 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20  st void *zBuf = 
200f0 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20  pPgHdr->pData;. 
20100 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
20110 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
20120 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
20130 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
20140 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
20150 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
20160 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e, 0);.    }.#en
20170 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65  dif..    /* Rele
20180 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
20190 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
201a0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
201b0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50  (pPgHdr);.    pP
201c0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
201d0 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  tDone = 1;.  }. 
201e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
201f0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
20200 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
20210 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20220 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
20230 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
20240 72 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  rc;.  if( MEMDB 
20250 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
20260 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
20270 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20280 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
20290 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
202a0 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
202b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
202c0 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
202d0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
202e0 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
202f0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
20300 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
20310 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
20320 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
20330 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
20340 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
20350 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
20360 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
20370 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
20380 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
20390 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
203a0 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
203b0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
203c0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
203d0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
203e0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
203f0 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
20400 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
20410 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
20420 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
20430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20440 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
20450 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
20460 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
20470 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
20480 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
20490 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
204a0 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
204b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
204c0 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
204d0 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
204e0 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
204f0 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
20500 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
20510 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
20520 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
20530 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
20540 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
20550 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
20560 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
20570 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
20580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20590 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
205a0 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
205b0 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
205c0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
205d0 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
205e0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
205f0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
20600 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
20610 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
20620 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
20630 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
20640 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
20650 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
20660 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
20670 70 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74  pPager, .  const
20680 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
20690 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b  .  int noSync.){
206a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
206b0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
206c0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
206d0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
206e0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
206f0 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68 61  ..  /* If no cha
20700 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d  nges have been m
20710 61 64 65 2c 20 77 65 20 63 61 6e 20 6c 65 61 76  ade, we can leav
20720 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
20730 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20  n early..  */.  
20740 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  if( pPager->dbMo
20750 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20  dified==0 &&.   
20760 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f       (pPager->jo
20770 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
20780 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
20790 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ETE ||.         
207a0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
207b0 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20  veMode!=0) ){.  
207c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
207d0 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
207e0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
207f0 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20  alOpen==0 );.   
20800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20810 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  K;.  }..  PAGERT
20820 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20  RACE(("DATABASE 
20830 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
20840 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25  aster=%s nSize=%
20850 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
20860 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
20870 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
20880 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a  >dbSize));..  /*
20890 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
208a0 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
208b0 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
208c0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
208d0 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  r this.  ** func
208e0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
208f0 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
20900 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
20910 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
20920 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
20930 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26  CED && !MEMDB &&
20940 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
20950 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
20960 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53   *pPg;..#ifdef S
20970 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
20980 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a  MIC_WRITE.    /*
20990 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   The atomic-writ
209a0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
209b0 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 61 6c  an be used if al
209c0 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  l of the.    ** 
209d0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
209e0 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ue:.    **.    *
209f0 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c 65 2d  *    + The file-
20a00 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
20a10 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
20a20 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20   property for.  
20a30 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73    **      blocks
20a40 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69   of size page-si
20a50 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  ze, and.    **  
20a60 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74 20    + This commit 
20a70 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
20a80 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
20a90 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
20aa0 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74 6c 79   **    + Exactly
20ab0 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65   one page has be
20ac0 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20  en modified and 
20ad0 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  store in the jou
20ae0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
20af0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
20b00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
20b10 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e 20 74   be used, then t
20b20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20b30 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a  will never.    *
20b40 2a 20 62 65 20 63 72 65 61 74 65 64 20 66 6f 72  * be created for
20b50 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
20b60 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  n..    */.    in
20b70 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65  t useAtomicWrite
20b80 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  ;.    pPg = sqli
20b90 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
20ba0 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
20bb0 68 65 29 3b 0a 20 20 20 20 75 73 65 41 74 6f 6d  he);.    useAtom
20bc0 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20 20  icWrite = (.    
20bd0 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26 20      !zMaster && 
20be0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
20bf0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 0a  >journalOpen &&.
20c00 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
20c10 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c  journalOff==jrnl
20c20 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
20c30 72 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  r) && .        p
20c40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70  Pager->dbSize>=p
20c50 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
20c60 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 70  e && .        (p
20c70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 44  Pg==0 || pPg->pD
20c80 69 72 74 79 3d 3d 30 29 0a 20 20 20 20 29 3b 0a  irty==0).    );.
20c90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20ca0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
20cb0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
20cc0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
20cd0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
20ce0 0a 20 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d  .    if( useAtom
20cf0 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20  icWrite ){.     
20d00 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e   /* Update the n
20d10 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
20d20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
20d30 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73  /.      int offs
20d40 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
20d50 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
20d60 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b  (aJournalMagic);
20d70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50  .      assert(pP
20d80 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a  ager->nRec==1);.
20d90 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
20da0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
20db0 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67  fd, offset, pPag
20dc0 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
20dd0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
20de0 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63  db file change c
20df0 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c  ounter. The foll
20e00 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20  owing call will 
20e10 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20  modify.      ** 
20e20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
20e30 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
20e40 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64  page 1 to includ
20e50 65 20 74 68 65 20 75 70 64 61 74 65 64 0a 20 20  e the updated.  
20e60 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f      ** change co
20e70 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77  unter and then w
20e80 72 69 74 65 20 70 61 67 65 20 31 20 64 69 72 65  rite page 1 dire
20e90 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61  ctly to the data
20ea0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69  base.      ** fi
20eb0 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74  le. Because of t
20ec0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
20ed0 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
20ee0 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
20ef0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  , .      ** this
20f00 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20   is safe..      
20f10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  */.      if( rc=
20f20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20f30 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20f40 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
20f50 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ter(pPager, 1);.
20f60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
20f70 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
20f80 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61  lite3JournalCrea
20f90 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  te(pPager->jfd);
20fa0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
20fb0 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20  !useAtomicWrite 
20fc0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
20fd0 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   ).#endif..    /
20fe0 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
20ff0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
21000 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
21010 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
21020 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
21030 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
21040 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
21050 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
21060 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
21070 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
21080 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
21090 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
210a0 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
210b0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
210c0 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
210d0 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
210e0 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
210f0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
21100 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
21110 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
21120 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
21130 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
21140 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
21150 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
21160 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
21170 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
21180 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ger, 0);.      i
21190 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
211a0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
211b0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  t;.      if( pPa
211c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
211d0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
211e0 4f 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66 6e 64  ODE_OFF ){.#ifnd
211f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
21200 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
21210 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
21220 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f  Size<pPager->dbO
21230 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
21240 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
21250 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
21260 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
21270 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
21280 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
21290 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
212a0 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
212b0 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
212c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
212d0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
212e0 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20    ** file..     
212f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21300 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20    Pgno i;.      
21310 20 20 20 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d      Pgno iSkip =
21320 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
21330 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
21340 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20    Pgno dbSize = 
21350 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
21360 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
21370 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
21380 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
21390 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d           for( i=
213a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31  pPager->dbSize+1
213b0 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  ; i<=pPager->dbO
213c0 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  rigSize; i++ ){.
213d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
213e0 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
213f0 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
21400 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d  urnal, i) && i!=
21410 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  iSkip ){.       
21420 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21430 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
21440 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20  er, i, &pPg);.  
21450 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21460 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21470 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
21480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
21490 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
214a0 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20  rite(pPg);.     
214b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
214c0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
214d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
214e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
214f0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
21500 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
21510 0a 20 20 20 20 20 20 20 20 20 20 7d 20 0a 20 20  .          } .  
21520 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21530 64 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b  dbSize = dbSize;
21540 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
21550 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  f.        rc = w
21560 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
21570 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
21580 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
21590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
215a0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
215b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e          rc = syn
215c0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
215d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
215e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
215f0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
21600 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66  c_exit;..#ifndef
21610 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21620 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
21630 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
21640 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
21650 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
21660 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
21670 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
21680 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
21690 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
216a0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
216b0 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
216c0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
216d0 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
216e0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
216f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
21700 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  Pg = sqlite3Pcac
21710 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
21720 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
21730 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
21740 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
21750 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
21760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21770 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21780 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
21790 44 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  D );.      /* Th
217a0 65 20 65 72 72 6f 72 20 6d 69 67 68 74 20 68 61  e error might ha
217b0 76 65 20 6c 65 66 74 20 74 68 65 20 64 69 72 74  ve left the dirt
217c0 79 20 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c 65  y list all foule
217d0 64 20 75 70 20 68 65 72 65 2c 0a 20 20 20 20 20  d up here,.     
217e0 20 2a 2a 20 62 75 74 20 74 68 61 74 20 64 6f 65   ** but that doe
217f0 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63  s not matter bec
21800 61 75 73 65 20 69 66 20 74 68 65 20 69 66 20 74  ause if the if t
21810 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 64 69  he dirty list di
21820 64 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 20 63  d.      ** get c
21830 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 74  orrupted, then t
21840 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
21850 69 6c 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6e  ill roll back an
21860 64 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 63 61  d.      ** disca
21870 72 64 20 74 68 65 20 64 69 72 74 79 20 6c 69 73  rd the dirty lis
21880 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 6e 20  t.  There is an 
21890 61 73 73 65 72 74 20 69 6e 0a 20 20 20 20 20 20  assert in.      
218a0 2a 2a 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  ** pager_get_all
218b0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 29 20 74  _dirty_pages() t
218c0 68 61 74 20 76 65 72 69 66 69 65 73 20 74 68 61  hat verifies tha
218d0 74 20 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20 20  t no attempt.   
218e0 20 20 20 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f     ** is made to
218f0 20 75 73 65 20 61 6e 20 69 6e 76 61 6c 69 64 20   use an invalid 
21900 64 69 72 74 79 20 6c 69 73 74 2e 0a 20 20 20 20  dirty list..    
21910 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20    */.      goto 
21920 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
21930 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
21940 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
21950 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
21960 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
21970 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
21980 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
21990 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79  >noSync && !noSy
219a0 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
219b0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
219c0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
219d0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
219e0 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
219f0 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22  E(("DBSYNC %p\n"
21a00 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
21a10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
21a20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
21a30 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20  }else if( MEMDB 
21a40 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
21a50 65 3c 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  e<pPager->dbFile
21a60 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Size ){.    rc =
21a70 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
21a80 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
21a90 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
21aa0 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20   }..sync_exit:. 
21ab0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21ac0 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b  IOERR_BLOCKED ){
21ad0 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e  .    /* pager_in
21ae0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
21af0 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74  () may attempt t
21b00 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  o obtain an excl
21b10 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63  usive.     * loc
21b20 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63  k to spill the c
21b30 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ache and return 
21b40 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42  IOERR_BLOCKED. B
21b50 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a  ut since .     *
21b60 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
21b70 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69 73  nce the cache is
21b80 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69   inconsistent, i
21b90 74 20 69 73 0a 20 20 20 20 20 2a 20 62 65 74 74  t is.     * bett
21ba0 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  er to return SQL
21bb0 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a  ITE_BUSY..     *
21bc0 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
21bd0 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65  E_BUSY;.  }.  re
21be0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
21bf0 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
21c00 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
21c10 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
21c20 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
21c30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
21c40 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
21c50 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
21c60 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
21c70 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
21c80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
21c90 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
21ca0 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
21cb0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
21cc0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
21cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
21ce0 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
21cf0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21d00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21d10 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
21d20 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
21d30 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
21d40 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
21d50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
21d60 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
21d70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
21d80 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
21d90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
21da0 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20  odified==0 &&.  
21db0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a        (pPager->j
21dc0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
21dd0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
21de0 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20  LETE ||.        
21df0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
21e00 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20  iveMode!=0) ){. 
21e10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21e20 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
21e30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
21e40 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
21e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21e60 4f 4b 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54  OK;.  }.  PAGERT
21e70 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64  RACE(("COMMIT %d
21e80 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
21e90 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74  ger)));.  assert
21ea0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
21eb0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c  =PAGER_SYNCED ||
21ec0 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65   MEMDB || !pPage
21ed0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b  r->dirtyCache );
21ee0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e  .  rc = pager_en
21ef0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
21f00 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
21f10 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d  tMaster);.  rc =
21f20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
21f30 67 65 72 2c 20 72 63 29 3b 0a 20 20 72 65 74 75  ger, rc);.  retu
21f40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21f50 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
21f60 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
21f70 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
21f80 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
21f90 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
21fa0 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
21fb0 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
21fc0 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
21fd0 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
21fe0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
21ff0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
22000 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
22010 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
22020 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
22030 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
22040 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
22050 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f  cking protocol o
22060 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
22070 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
22080 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
22090 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
220a0 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
220b0 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
220c0 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
220d0 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
220e0 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
220f0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
22100 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
22110 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
22120 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
22130 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
22140 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22150 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
22160 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
22170 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22180 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22190 45 5f 4f 4b 3b 0a 20 20 50 41 47 45 52 54 52 41  E_OK;.  PAGERTRA
221a0 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE(("ROLLBACK %d
221b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
221c0 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70  ger)));.  if( !p
221d0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
221e0 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f  e || !pPager->jo
221f0 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
22200 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
22210 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
22220 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
22230 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20  aster);.  }else 
22240 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
22250 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
22260 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
22270 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
22280 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
22290 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
222a0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
222b0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
222c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
222d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
222e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
222f0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
22300 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
22310 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
22320 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  2;.      rc = pa
22330 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
22340 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ger, 0);.      r
22350 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
22360 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
22370 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
22380 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
22390 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
223a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
223b0 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
223c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
223d0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
223e0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
223f0 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   }..    if( !MEM
22400 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
22410 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
22420 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
22430 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
22440 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
22450 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
22460 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
22470 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
22480 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
22490 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
224a0 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
224b0 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
224c0 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e      ** persisten
224d0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  t..    */.    rc
224e0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
224f0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a  Pager, rc);.  }.
22500 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22510 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
22520 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
22530 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
22540 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
22550 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
22560 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
22570 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
22580 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69  able..*/.u8 sqli
22590 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
225a0 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
225b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
225c0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
225d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
225e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
225f0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
22600 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
22610 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
22620 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22630 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
22640 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
22650 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
22660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22670 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
22680 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
22690 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
226a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
226b0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
226c0 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29  t(DbPage *pPage)
226d0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
226e0 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
226f0 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  ount(pPage);.}..
22700 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
22710 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
22720 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
22730 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
22740 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
22750 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
22760 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
22770 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
22780 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
22790 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
227a0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
227b0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
227c0 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  1] = sqlite3Pcac
227d0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
227e0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
227f0 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[2] = sqlite3Pc
22800 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65  acheGetCachesize
22810 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22820 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  );.  a[3] = pPag
22830 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
22840 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e  ? (int) pPager->
22850 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61  dbSize : -1;.  a
22860 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
22870 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
22880 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
22890 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
228a0 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
228b0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
228c0 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
228d0 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
228e0 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
228f0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
22900 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
22910 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
22920 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74 20 73 71  turn a;.}.int sq
22930 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64  lite3PagerIsMemd
22940 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  b(Pager *pPager)
22950 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42  {.  return MEMDB
22960 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
22970 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68  * Ensure that th
22980 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73 74  ere are at least
22990 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65   nSavepoint save
229a0 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  points open..*/.
229b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
229c0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61  OpenSavepoint(Pa
229d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
229e0 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   nSavepoint){.  
229f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22a00 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 53 61 76 65  OK;..  if( nSave
22a10 70 6f 69 6e 74 3e 70 50 61 67 65 72 2d 3e 6e 53  point>pPager->nS
22a20 61 76 65 70 6f 69 6e 74 20 26 26 20 70 50 61 67  avepoint && pPag
22a30 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
22a40 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  {.    int ii;.  
22a50 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
22a60 20 2a 61 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20   *aNew;..    /* 
22a70 45 69 74 68 65 72 20 74 68 65 20 73 75 62 2d 6a  Either the sub-j
22a80 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 6f  ournal is open o
22a90 72 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  r there are no a
22aa0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
22ab0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
22ac0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
22ad0 69 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  int==0 || pPager
22ae0 2d 3e 73 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  ->sjfd->pMethods
22af0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77   );..    /* Grow
22b00 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
22b10 70 6f 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e  point array usin
22b20 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74  g realloc(). Ret
22b30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22b40 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61  .    ** if the a
22b50 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e  llocation fails.
22b60 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f   Otherwise, zero
22b70 20 74 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e   the new portion
22b80 20 69 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20   in case a .    
22b90 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  ** malloc failur
22ba0 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70  e occurs while p
22bb0 6f 70 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20  opulating it in 
22bc0 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f  the for(...) loo
22bd0 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a  p below..    */.
22be0 20 20 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65      aNew = (Page
22bf0 72 53 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c  rSavepoint *)sql
22c00 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20  ite3Realloc(.   
22c10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
22c20 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28  vepoint, sizeof(
22c30 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a  PagerSavepoint)*
22c40 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29  nSavepoint.    )
22c50 3b 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77 20  ;.    if( !aNew 
22c60 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22c70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
22c80 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26    }.    memset(&
22c90 61 4e 65 77 5b 70 50 61 67 65 72 2d 3e 6e 53 61  aNew[pPager->nSa
22ca0 76 65 70 6f 69 6e 74 5d 2c 20 30 2c 0a 20 20 20  vepoint], 0,.   
22cb0 20 20 20 20 20 28 6e 53 61 76 65 70 6f 69 6e 74       (nSavepoint
22cc0 20 2d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   - pPager->nSave
22cd0 70 6f 69 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28  point) * sizeof(
22ce0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 0a  PagerSavepoint).
22cf0 20 20 20 20 29 3b 0a 20 20 20 20 70 50 61 67 65      );.    pPage
22d00 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
22d10 61 4e 65 77 3b 0a 20 20 20 20 69 69 20 3d 20 70  aNew;.    ii = p
22d20 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
22d30 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  t;.    pPager->n
22d40 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76  Savepoint = nSav
22d50 65 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20  epoint;..    /* 
22d60 50 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61 67  Populate the Pag
22d70 65 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75  erSavepoint stru
22d80 63 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f  ctures just allo
22d90 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f  cated. */.    fo
22da0 72 28 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 69  r(/* no-op */; i
22db0 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  i<nSavepoint; ii
22dc0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
22dd0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
22de0 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20  eValid );.      
22df0 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d  aNew[ii].nOrig =
22e00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
22e10 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
22e20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
22e30 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
22e40 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  lOff>0 ){.      
22e50 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73    aNew[ii].iOffs
22e60 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
22e70 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d  rnalOff;.      }
22e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e  else{.        aN
22e90 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d  ew[ii].iOffset =
22ea0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
22eb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
22ec0 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
22ed0 69 53 75 62 52 65 63 20 3d 20 70 50 61 67 65 72  iSubRec = pPager
22ee0 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 20 20  ->stmtNRec;.    
22ef0 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61    aNew[ii].pInSa
22f00 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65  vepoint = sqlite
22f10 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
22f20 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
22f30 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69       if( !aNew[i
22f40 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  i].pInSavepoint 
22f50 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
22f60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
22f70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
22f80 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73     /* Open the s
22f90 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  ub-journal, if i
22fa0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
22fb0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
22fc0 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
22fd0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
22fe0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
22ff0 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
23000 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65  r op is always e
23010 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
23020 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45  ROLLBACK or SAVE
23030 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a  POINT_RELEASE..*
23040 2a 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  * If it is SAVEP
23050 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
23060 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64  en release and d
23070 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65 70  estroy the savep
23080 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64  oint with.** ind
23090 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49  ex iSavepoint. I
230a0 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
230b0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
230c0 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   rollback all ch
230d0 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61  anges.** that ha
230e0 76 65 20 6f 63 63 75 72 65 64 20 73 69 6e 63 65  ve occured since
230f0 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65   savepoint iSave
23100 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74 65  point was create
23110 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68  d..**.** In eith
23120 65 72 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76  er case, all sav
23130 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20  epoints with an 
23140 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
23150 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a  an iSavepoint .*
23160 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e  * are destroyed.
23170 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
23180 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 28 69  are less than (i
23190 53 61 76 65 70 6f 69 6e 74 2b 31 29 20 61 63 74  Savepoint+1) act
231a0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 77  ive savepoints w
231b0 68 65 6e 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hen this .** fun
231c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
231d0 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
231e0 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  / .int sqlite3Pa
231f0 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67  gerSavepoint(Pag
23200 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
23210 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
23220 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
23230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
23240 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
23250 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
23260 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
23270 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  LBACK );..  if( 
23280 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67 65  iSavepoint<pPage
23290 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  r->nSavepoint ){
232a0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
232b0 20 69 6e 74 20 6e 4e 65 77 20 3d 20 69 53 61 76   int nNew = iSav
232c0 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41  epoint + (op==SA
232d0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
232e0 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e  );.    for(ii=nN
232f0 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  ew; ii<pPager->n
23300 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
23310 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
23320 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
23330 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
23340 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
23350 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
23360 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
23370 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 69 66 28  = nNew;..    if(
23380 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
23390 4f 4c 4c 42 41 43 4b 20 26 26 20 70 50 61 67 65  OLLBACK && pPage
233a0 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
233b0 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 53   ){.      PagerS
233c0 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
233d0 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29  oint = (nNew==0)
233e0 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61 76  ?0:&pPager->aSav
233f0 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a  epoint[nNew-1];.
23400 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
23410 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
23420 74 28 70 50 61 67 65 72 2c 20 70 53 61 76 65 70  t(pPager, pSavep
23430 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61 73 73  oint);.      ass
23440 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45 5f 44  ert(rc!=SQLITE_D
23450 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ONE);.    }.  . 
23460 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
23470 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68   a release of th
23480 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  e outermost save
23490 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20  point, truncate 
234a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
234b0 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
234c0 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26 20 6f  if( nNew==0 && o
234d0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
234e0 45 41 53 45 20 26 26 20 70 50 61 67 65 72 2d 3e  EASE && pPager->
234f0 73 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  sjfd->pMethods )
23500 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
23520 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23530 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
23540 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a  ager->sjfd, 0);.
23550 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
23560 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
23570 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
23580 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
23590 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
235a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
235b0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
235c0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
235d0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
235e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
235f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
23600 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
23610 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
23620 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  FS structure for
23630 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63   the pager..*/.c
23640 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  onst sqlite3_vfs
23650 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66   *sqlite3PagerVf
23660 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
23670 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
23680 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->pVfs;.}../*.*
23690 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
236a0 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  e handle for the
236b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
236c0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
236d0 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  h the pager.  Th
236e0 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  is might return 
236f0 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65  NULL if the file
23700 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20   has.** not yet 
23710 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  been opened..*/.
23720 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71  sqlite3_file *sq
23730 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50  lite3PagerFile(P
23740 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
23750 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
23760 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fd;.}../*.** Ret
23770 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
23780 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
23790 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
237a0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
237b0 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72  gerDirname(Pager
237c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
237d0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
237e0 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
237f0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
23800 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
23810 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
23820 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
23830 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
23840 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
23850 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
23860 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
23870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23880 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
23890 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
238a0 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
238b0 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
238c0 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
238d0 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
238e0 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
238f0 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
23900 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
23910 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
23920 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69  r->noSync;.}..#i
23930 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
23940 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CODEC./*.** Set 
23950 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
23960 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
23970 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
23980 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  Codec(.  Pager *
23990 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a  pPager,.  void *
239a0 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
239b0 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
239c0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
239d0 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
239e0 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
239f0 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
23a00 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
23a10 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
23a20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23a30 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
23a40 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
23a50 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
23a60 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
23a70 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
23a80 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
23a90 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
23aa0 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
23ab0 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
23ac0 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
23ad0 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
23ae0 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
23af0 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
23b00 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
23b10 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
23b20 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f  ed at pgno is no
23b30 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
23b40 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
23b50 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
23b60 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20  put there by by 
23b70 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
23b80 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
23b90 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72  o the page pPg r
23ba0 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
23bb0 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
23bc0 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
23bd0 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e  d with pPg (i.e.
23be0 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
23bf0 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
23c00 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
23c10 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
23c20 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
23c30 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
23c40 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
23c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
23c60 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
23c70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
23c80 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
23c90 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
23ca0 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
23cb0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
23cc0 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
23cd0 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
23ce0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
23cf0 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
23d00 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
23d10 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
23d20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
23d30 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
23d40 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tive)..**.** If 
23d50 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
23d60 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69  ent, isCommit, i
23d70 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
23d80 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65   this page is be
23d90 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20  ing.** moved as 
23da0 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61  part of a databa
23db0 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f  se reorganizatio
23dc0 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  n just before th
23dd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
23de0 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * is being commi
23df0 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  tted. In this ca
23e00 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  se, it is guaran
23e10 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61  teed that the da
23e20 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20  tabase page .** 
23e30 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69  pPg refers to wi
23e40 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
23e50 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69  n to again withi
23e60 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
23e70 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
23e80 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
23e90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
23ea0 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
23eb0 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d   pgno, int isCom
23ec0 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  mit){.  PgHdr *p
23ed0 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70  PgOld;  /* The p
23ee0 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72  age being overwr
23ef0 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f  itten. */.  Pgno
23f00 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
23f10 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
23f20 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
23f30 50 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56  PAGERTRACE(("MOV
23f40 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
23f50 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
23f60 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
23f70 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
23f80 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70  ), pPg->pgno, (p
23f90 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
23fa0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20  NEED_SYNC)?1:0, 
23fb0 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43  pgno));.  IOTRAC
23fc0 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25  E(("MOVE %p %d %
23fd0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
23fe0 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a  g->pgno, pgno)).
23ff0 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e  .  pager_get_con
24000 74 65 6e 74 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  tent(pPg);..  /*
24010 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
24020 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
24030 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65  ()ed before page
24040 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20   pPg->pgno can. 
24050 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74   ** be written t
24060 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  o, store pPg->pg
24070 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  no in local vari
24080 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  able needSyncPgn
24090 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  o..  **.  ** If 
240a0 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  the isCommit fla
240b0 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20  g is set, there 
240c0 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
240d0 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a  member that.  **
240e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
240f0 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
24100 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
24110 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
24120 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72   .  ** can be wr
24130 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
24140 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
24150 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
24160 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20   write to it..  
24170 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  */.  if( (pPg->f
24180 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
24190 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d  SYNC) && !isComm
241a0 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  it ){.    needSy
241b0 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
241c0 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
241d0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
241e0 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e  g) || pPg->pgno>
241f0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
24200 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
24210 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
24220 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20  DR_DIRTY );.    
24230 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24240 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
24250 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
24260 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
24270 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
24280 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
24290 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
242a0 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
242b0 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72  so, if the PgHdr
242c0 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65  .needSync was se
242d0 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  t for .  ** page
242e0 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65   pgno before the
242f0 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f   'move' operatio
24300 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  n, it needs to b
24310 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a  e retained .  **
24320 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f   for the page mo
24330 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ved there..  */.
24340 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
24350 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  ~PGHDR_NEED_SYNC
24360 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  ;.  pPgOld = pag
24370 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
24380 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
24390 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50  t( !pPgOld || pP
243a0 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  gOld->nRef==1 );
243b0 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
243c0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
243d0 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67  |= (pPgOld->flag
243e0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
243f0 43 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  C);.  }..  sqlit
24400 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67  e3PcacheMove(pPg
24410 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
24420 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 73 71 6c  PgOld ){.    sql
24430 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
24440 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 73  PgOld);.  }..  s
24450 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
24460 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
24470 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
24480 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
24490 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
244a0 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
244b0 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
244c0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
244d0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
244e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
244f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
24500 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
24510 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
24520 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
24530 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
24540 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
24550 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
24560 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
24570 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
24580 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
24590 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c    ** "is journal
245a0 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67 20  ed" bitvec flag 
245b0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
245c0 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
245d0 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a  emedied by.    *
245e0 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61  * loading the pa
245f0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
24600 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
24610 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
24620 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66  edSync .    ** f
24630 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
24640 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d 70  ** If the attemp
24650 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61  t to load the pa
24660 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
24670 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64  -cache fails, (d
24680 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d  ue.    ** to a m
24690 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
246a0 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68  ilure), clear th
246b0 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e  e bit in the pIn
246c0 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a  Journal[].    **
246d0 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73   array. Otherwis
246e0 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  e, if the page i
246f0 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69  s loaded and wri
24700 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20  tten again in.  
24710 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61    ** this transa
24720 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65  ction, it may be
24730 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
24740 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
24750 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69  fore.    ** it i
24760 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  s synced into th
24770 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
24780 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79  This way, it may
24790 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a   end up in.    *
247a0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
247b0 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74 68  le twice, but th
247c0 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  at is not a prob
247d0 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lem..    **.    
247e0 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61  ** The sqlite3Pa
247f0 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61  gerGet() call ma
24800 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72  y cause the jour
24810 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20  nal to sync. So 
24820 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
24830 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
24840 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
24850 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  too..    */.    
24860 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64  int rc;.    PgHd
24870 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61  r *pPgHdr;.    a
24880 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
24890 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72  eedSync );.    r
248a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
248b0 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64  Get(pPager, need
248c0 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64  SyncPgno, &pPgHd
248d0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
248e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
248f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
24900 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 6e 65 65  InJournal && nee
24910 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65  dSyncPgno<=pPage
24920 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
24930 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24940 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67  BitvecClear(pPag
24950 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
24960 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20  needSyncPgno);. 
24970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
24980 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24990 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
249a0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65  nc = 1;.    asse
249b0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  rt( pPager->noSy
249c0 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20  nc==0 && !MEMDB 
249d0 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66  );.    pPgHdr->f
249e0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
249f0 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c  ED_SYNC;.    sql
24a00 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
24a10 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20  rty(pPgHdr);.   
24a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
24a30 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
24a40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24a50 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
24a60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
24a70 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74  inter to the dat
24a80 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  a for the specif
24a90 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
24aa0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
24ab0 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70  etData(DbPage *p
24ac0 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg){.  assert( p
24ad0 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50  Pg->nRef>0 || pP
24ae0 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  g->pPager->memDb
24af0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67   );.  return pPg
24b00 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pData;.}../*.*
24b10 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
24b20 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
24b30 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
24b40 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
24b50 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
24b60 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
24b70 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
24b80 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
24b90 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
24ba0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
24bb0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
24bc0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
24bd0 70 50 61 67 65 72 3f 70 50 67 2d 3e 70 45 78 74  pPager?pPg->pExt
24be0 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ra:0);.}../*.** 
24bf0 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
24c00 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
24c10 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
24c20 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
24c30 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
24c40 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
24c50 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
24c60 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
24c70 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
24c80 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
24c90 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
24ca0 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
24cb0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
24cc0 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
24cd0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
24ce0 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
24cf0 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
24d00 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
24d10 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
24d20 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
24d30 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
24d40 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
24d50 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
24d60 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
24d70 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
24d80 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
24d90 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
24da0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
24db0 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
24dc0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
24dd0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
24de0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
24df0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
24e00 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
24e10 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
24e20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
24e30 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
24e40 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
24e50 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
24e60 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
24e70 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
24e80 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
24e90 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
24ea0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
24eb0 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
24ec0 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
24ed0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
24ee0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
24ef0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
24f00 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20  u8)eMode;.  }.  
24f10 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
24f20 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
24f30 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
24f40 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  set the journal-
24f50 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
24f60 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
24f70 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
24f80 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41   of:.**.**    PA
24f90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
24fa0 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45  QUERY.**    PAGE
24fb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
24fc0 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  LETE.**    PAGER
24fd0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
24fe0 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  NCATE.**    PAGE
24ff0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
25000 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45  RSIST.**    PAGE
25010 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
25020 46 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  F.**.** If the p
25030 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
25040 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65  _QUERY, then the
25050 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
25060 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76   set to the.** v
25070 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
25080 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
25090 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  ed indicate the 
250a0 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
250b0 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f  y updated).** jo
250c0 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
250d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  nt sqlite3PagerJ
250e0 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
250f0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
25100 6f 64 65 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d  ode){.  if( !MEM
25110 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
25120 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  ( eMode==PAGER_J
25130 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
25140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
25150 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
25160 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
25170 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
25180 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
25190 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
251a0 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  CATE.           
251b0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
251c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
251d0 45 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20  ERSIST.         
251e0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
251f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
25200 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
25210 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
25220 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
25230 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 61 73  MEMORY );.    as
25240 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
25250 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  NALMODE_QUERY<0 
25260 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  );.    if( eMode
25270 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  >=0 ){.      pPa
25280 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
25290 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20   = (u8)eMode;.  
252a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
252b0 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
252c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
252d0 51 55 45 52 59 20 29 3b 0a 20 20 20 20 7d 0a 20  QUERY );.    }. 
252e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
252f0 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  )pPager->journal
25300 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
25310 65 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d  et/set the size-
25320 6c 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70  limit used for p
25330 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
25340 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20  l files..*/.i64 
25350 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
25360 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67  nalSizeLimit(Pag
25370 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20  er *pPager, i64 
25380 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69  iLimit){.  if( i
25390 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20  Limit>=-1 ){.   
253a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
253b0 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  SizeLimit = iLim
253c0 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
253d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
253e0 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65  SizeLimit;.}..#e
253f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
25400 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a        MIT_DISKIO */.