/ Hex Artifact Content
Login

Artifact eede73b78da4ecce58476d25cc9404910724d2ae:


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 36  : pager.c,v 1.56
0350: 39 20 32 30 30 39 2f 30 32 2f 31 37 20 31 36 3a  9 2009/02/17 16:
0360: 31 37 3a 30 32 20 64 72 68 20 45 78 70 20 24 0a  17:02 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 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
1320: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
1330: 72 20 73 69 7a 65 2e 20 31 36 4d 42 2e 20 49 66  r size. 16MB. If
1340: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
1350: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
1360: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
1370: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
1380: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
1390: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
13a0: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
13b0: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
13c0: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
13d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
13e0: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
13f0: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
1400: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
1410: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
1420: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
1430: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
1440: 49 5a 45 20 30 78 30 31 30 30 30 30 30 0a 0a 2f  IZE 0x0100000../
1450: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
1460: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1470: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
1480: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
1490: 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65  h active.** save
14a0: 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d  point and statem
14b0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
14c0: 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41  in the system. A
14d0: 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72  ll such structur
14e0: 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  es.** are stored
14f0: 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53   in the Pager.aS
1500: 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79  avepoint[] array
1510: 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63  , which is alloc
1520: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69  ated and.** resi
1530: 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  zed using sqlite
1540: 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a  3Realloc()..**.*
1550: 2a 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  * When a savepoi
1560: 6e 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74  nt is created, t
1570: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
1580: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
1590: 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ld is.** set to 
15a0: 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d  0. If a journal-
15b0: 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
15c0: 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  n into the main 
15d0: 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a  journal while.**
15e0: 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69   the savepoint i
15f0: 73 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69  s active, then i
1600: 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
1610: 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66   to the byte off
1620: 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  set .** immediat
1630: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
1640: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72  e last journal r
1650: 65 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e  ecord written in
1660: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  to the main.** j
1670: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68  ournal before th
1680: 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
1690: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
16a0: 65 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f  ed during savepo
16b0: 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  int.** rollback 
16c0: 28 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61  (see pagerPlayba
16d0: 63 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a  ckSavepoint())..
16e0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
16f0: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1700: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b   PagerSavepoint;
1710: 0a 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76  .struct PagerSav
1720: 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69  epoint {.  i64 i
1730: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1740: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
1750: 69 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61  ing offset in ma
1760: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
1770: 69 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20  i64 iHdrOffset; 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1790: 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42  See above */.  B
17a0: 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f  itvec *pInSavepo
17b0: 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  int;        /* S
17c0: 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  et of pages in t
17d0: 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f  his savepoint */
17e0: 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20  .  Pgno nOrig;  
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62  /* Original numb
1810: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66  er of pages in f
1820: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53  ile */.  Pgno iS
1830: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
1840: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1850: 66 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69  f first record i
1860: 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  n sub-journal */
1870: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
1880: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
1890: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
18a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
18b0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72  ucture..**.** er
18c0: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61  rCode.**.**   Pa
18d0: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
18e0: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
18f0: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
1900: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20 20  ORRUPT, or.**   
1910: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20  or SQLITE_FULL. 
1920: 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  Once one of the 
1930: 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f  first three erro
1940: 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65  rs occurs, it pe
1950: 72 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64 20  rsists.**   and 
1960: 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74  is returned as t
1970: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65  he result of eve
1980: 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41  ry major pager A
1990: 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a  PI call.  The.**
19a0: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72     SQLITE_FULL r
19b0: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c  eturn code is sl
19c0: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
19d0: 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e  . It persists on
19e0: 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  ly until the.** 
19f0: 20 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75    next successfu
1a00: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
1a10: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
1a20: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
1a30: 2c 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55  ,.**   SQLITE_FU
1a40: 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65  LL does not affe
1a50: 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ct the sqlite3Pa
1a60: 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c  gerGet() and sql
1a70: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1a80: 29 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68 65  ).**   APIs, the
1a90: 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75  y may still be u
1aa0: 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  sed successfully
1ab0: 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56 61  ..**.** dbSizeVa
1ac0: 6c 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62 4f  lid, dbSize, dbO
1ad0: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
1ae0: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61  ize.**.**   Mana
1af0: 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66  ging the size of
1b00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b10: 6c 65 20 69 6e 20 70 61 67 65 73 20 69 73 20 61  le in pages is a
1b20: 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61   little complica
1b30: 74 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76 61  ted..**   The va
1b40: 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53  riable Pager.dbS
1b50: 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ize contains the
1b60: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b70: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1b80: 73 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63 75  se.**   image cu
1b90: 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
1ba0: 2e 20 41 73 20 74 68 65 20 64 61 74 61 62 61 73  . As the databas
1bb0: 65 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72  e image grows or
1bc0: 20 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a   shrinks this.**
1bd0: 20 20 20 76 61 72 69 61 62 6c 65 20 69 73 20 75     variable is u
1be0: 70 64 61 74 65 64 2e 20 54 68 65 20 76 61 72 69  pdated. The vari
1bf0: 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69 6c  able Pager.dbFil
1c00: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
1c10: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f  he number.**   o
1c20: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1c30: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1c40: 69 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  is may be differ
1c50: 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64  ent from Pager.d
1c60: 62 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73 6f  bSize.**   if so
1c70: 6d 65 20 70 61 67 65 73 20 68 61 76 65 20 62 65  me pages have be
1c80: 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  en appended to t
1c90: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
1ca0: 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72  e but not yet wr
1cb0: 69 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20 66  itten.**   out f
1cc0: 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f  rom the cache to
1cd0: 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1ce0: 20 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20   on disk. Or if 
1cf0: 74 68 65 20 69 6d 61 67 65 20 68 61 73 20 62 65  the image has be
1d00: 65 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74 65  en.**   truncate
1d10: 64 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e  d by an incremen
1d20: 74 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  tal-vacuum opera
1d30: 74 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72 2e  tion. The Pager.
1d40: 64 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69 61  dbOrigSize varia
1d50: 62 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e  ble.**   contain
1d60: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d70: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
1d80: 61 62 61 73 65 20 69 6d 61 67 65 20 77 68 65 6e  abase image when
1d90: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1da0: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61    transaction wa
1db0: 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f  s opened. The co
1dc0: 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68  ntents of all th
1dd0: 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 72  ree of these var
1de0: 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20 6f  iables is.**   o
1df0: 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 74  nly guaranteed t
1e00: 6f 20 62 65 20 63 6f 72 72 65 63 74 20 69 66 20  o be correct if 
1e10: 74 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65  the boolean Page
1e20: 72 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73  r.dbSizeValid is
1e30: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54   true..**.**   T
1e40: 4f 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74 20  ODO: Under what 
1e50: 63 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64 62  conditions is db
1e60: 53 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20 43  SizeValid set? C
1e70: 6c 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68  leared?.**.** ch
1e80: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a  angeCountDone.**
1e90: 0a 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65  .**   This boole
1ea0: 61 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  an variable is u
1eb0: 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
1ec0: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65   that the change
1ed0: 2d 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28  -counter .**   (
1ee0: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
1ef0: 72 20 66 69 65 6c 64 20 61 74 20 62 79 74 65 20  r field at byte 
1f00: 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
1f10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1f20: 69 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64  is .**   not upd
1f30: 61 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20  ated more often 
1f40: 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20  than necessary. 
1f50: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73  .**.**   It is s
1f60: 65 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20  et to true when 
1f70: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1f80: 65 72 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  er field is upda
1f90: 74 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20  ted, which .**  
1fa0: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
1fb0: 20 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65   if an exclusive
1fc0: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
1fd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fe0: 6c 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63  le..**   It is c
1ff0: 6c 65 61 72 65 64 20 28 73 65 74 20 74 6f 20 66  leared (set to f
2000: 61 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20 61  alse) whenever a
2010: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
2020: 20 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71   is .**   relinq
2030: 75 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61  uished on the da
2040: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63  tabase file. Eac
2050: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
2060: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
2070: 64 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e  d,.**   The chan
2080: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
2090: 20 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49   is inspected. I
20a0: 66 20 69 74 20 69 73 20 74 72 75 65 2c 20 74 68  f it is true, th
20b0: 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75  e work of.**   u
20c0: 70 64 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e  pdating the chan
20d0: 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d  ge-counter is om
20e0: 69 74 74 65 64 20 66 6f 72 20 74 68 65 20 63 75  itted for the cu
20f0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2100: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  n..**.**   This 
2110: 6d 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20  mechanism means 
2120: 74 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  that when runnin
2130: 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
2140: 6f 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ode, a connectio
2150: 6e 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c  n .**   need onl
2160: 79 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  y update the cha
2170: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65  nge-counter once
2180: 2c 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  , for the first 
2190: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
21a0: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
21b0: 2a 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a  * dbModified.**.
21c0: 2a 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69 66  **   The dbModif
21d0: 69 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ied flag is set 
21e0: 77 68 65 6e 65 76 65 72 20 61 20 64 61 74 61 62  whenever a datab
21f0: 61 73 65 20 70 61 67 65 20 69 73 20 64 69 72 74  ase page is dirt
2200: 69 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20  ied..**   It is 
2210: 63 6c 65 61 72 65 64 20 61 74 20 74 68 65 20 65  cleared at the e
2220: 6e 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e 73  nd of each trans
2230: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2240: 49 74 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  It is used when 
2250: 63 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f 74  committing or ot
2260: 68 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20 61  herwise ending a
2270: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
2280: 0a 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64 69  .**   the dbModi
2290: 66 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c 65  fied flag is cle
22a0: 61 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f 72  ar then less wor
22b0: 6b 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65  k has to be done
22c0: 2e 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53  ..**.** journalS
22d0: 74 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54  tarted.**.**   T
22e0: 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20  his flag is set 
22f0: 77 68 65 6e 65 76 65 72 20 74 68 65 20 74 68 65  whenever the the
2300: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
2310: 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   synced. .**.** 
2320: 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20 74    The point of t
2330: 68 69 73 20 66 6c 61 67 20 69 73 20 74 68 61 74  his flag is that
2340: 20 69 74 20 6d 75 73 74 20 62 65 20 73 65 74 20   it must be set 
2350: 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20 20 20  after the .**   
2360: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
2370: 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72 6e 61  ader in a journa
2380: 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
2390: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
23a0: 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69 73 20  **   After this 
23b0: 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 6e 65  has happened, ne
23c0: 77 20 70 61 67 65 73 20 61 70 70 65 6e 64 65 64  w pages appended
23d0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
23e0: 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e 65   .**   do not ne
23f0: 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ed the PGHDR_NEE
2400: 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65 74 2c  D_SYNC flag set,
2410: 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   as they do not 
2420: 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61 69  need.**   to wai
2430: 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  t for a journal 
2440: 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68 65 79  sync before they
2450: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2460: 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  out to.**   the 
2470: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73  database file (s
2480: 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65  ee function page
2490: 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20 20  r_write())..**  
24a0: 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a 2a   .** setMaster.*
24b0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
24c0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
24d0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
24e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
24f0: 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 28 69  ile name.**   (i
2500: 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79 20 77  f any) is only w
2510: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
2520: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 63  journal file onc
2530: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  e..**.**   When 
2540: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
2550: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6d 61  nsaction, the ma
2560: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2570: 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79 29 0a  e name (if any).
2580: 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72 69 74  **   may be writ
2590: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
25a0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 20  rnal file while 
25b0: 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69  the pager is sti
25c0: 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47 45 52  ll in.**   PAGER
25d0: 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 20  _RESERVED state 
25e0: 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61 73 65  (see CommitPhase
25f0: 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20 61 63  One() for the ac
2600: 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20 20 74  tion). It.**   t
2610: 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  hen attempts to 
2620: 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20 65 78  upgrade to an ex
2630: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 49 66  clusive lock. If
2640: 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a 2a 2a   this attempt.**
2650: 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 53     fails, then S
2660: 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79 20 62  QLITE_BUSY may b
2670: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
2680: 65 20 75 73 65 72 20 61 6e 64 20 74 68 65 20 75  e user and the u
2690: 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61 74 74  ser.**   may att
26a0: 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74  empt to commit t
26b0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  he transaction a
26c0: 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61 6c 6c  gain later (call
26d0: 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69 74 50  ing.**   CommitP
26e0: 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69 6e 29  haseOne() again)
26f0: 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 75  . This flag is u
2700: 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
2710: 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d 61 73  at the .**   mas
2720: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
2730: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
2740: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2750: 66 69 6c 65 20 74 68 65 20 66 69 72 73 74 0a 2a  file the first.*
2760: 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69 74 50  *   time CommitP
2770: 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c  haseOne() is cal
2780: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74  led..**.** doNot
2790: 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Sync.**.**   Thi
27a0: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  s variable is se
27b0: 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79  t and cleared by
27c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27d0: 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64  te()..**.** need
27e0: 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44  Sync.**.**   TOD
27f0: 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20 65  O: It might be e
2800: 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68 69  asier to set thi
2810: 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77 72  s variable in wr
2820: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 0a  iteJournalHdr().
2830: 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d 61  **   and writeMa
2840: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f 6e  sterJournal() on
2850: 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20 6d  ly. Change its m
2860: 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79 6e  eaning to "unsyn
2870: 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68 61  ced data.**   ha
2880: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2890: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e 0a  o the journal"..
28a0: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
28b0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
28c0: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
28d0: 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20  /* OS functions 
28e0: 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f  to use for IO */
28f0: 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d  .  u8 exclusiveM
2900: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
2910: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20  * Boolean. True 
2920: 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  if locking_mode=
2930: 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20  =EXCLUSIVE */.  
2940: 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20  u8 journalMode; 
2950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2960: 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  n of the PAGER_J
2970: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c  OURNALMODE_* val
2980: 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ues */.  u8 useJ
2990: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
29a0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
29b0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
29c0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
29d0: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f0: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2a00: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2a10: 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  s */.  u8 noSync
2a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a30: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
2a40: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
2a50: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
2a60: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
2a70: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
2a80: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
2a90: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
2aa0: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73  stness */.  u8 s
2ab0: 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20  ync_flags;      
2ac0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2ad0: 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  f SYNC_NORMAL or
2ae0: 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20   SYNC_FULL */.  
2af0: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2b10: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
2b20: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
2b30: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b50: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
2b60: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
2b70: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
2ba0: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
2bb0: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
2bc0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e  lowing block con
2bd0: 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73  tains those clas
2be0: 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61  s members that a
2bf0: 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  re dynamically. 
2c00: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72   ** modified dur
2c10: 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  ing normal opera
2c20: 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72  tions. The other
2c30: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
2c40: 69 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  is structure.  *
2c50: 2a 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e  * are either con
2c60: 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74  stant throughout
2c70: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
2c80: 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65   the pager, or e
2c90: 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f  lse.  ** used to
2ca0: 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61   store configura
2cb0: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20  tion parameters 
2cc0: 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20  that affect the 
2cd0: 77 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20  way the pager . 
2ce0: 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20   ** operates..  
2cf0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61  **.  ** The 'sta
2d00: 74 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20  te' variable is 
2d10: 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72  described in mor
2d20: 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77  e detail along w
2d30: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  ith the.  ** des
2d40: 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65  criptions of the
2d50: 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74   values it may t
2d60: 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f  ake - PAGER_UNLO
2d70: 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20  CK etc. Many of 
2d80: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76  the.  ** other v
2d90: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73  ariables in this
2da0: 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72   block are descr
2db0: 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ibed in the comm
2dc0: 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20  ent directly .  
2dd0: 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c  ** above this cl
2de0: 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  ass definition..
2df0: 20 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b    */.  u8 state;
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
2e20: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
2e30: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
2e40: 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b    u8 dbModified;
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e60: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61   True if there a
2e70: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  re any changes t
2e80: 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38  o the Db */.  u8
2e90: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
2ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2eb0: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
2ec0: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
2ed0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
2ee0: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
2ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f00: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
2f10: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2f20: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
2f30: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
2f40: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
2f50: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2f60: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
2f70: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
2f80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f90: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
2fa0: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
2fb0: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
2fc0: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
2fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fe0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
2ff0: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
3000: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
3010: 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c  /.  u8 dbSizeVal
3020: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3030: 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69  /* Set when dbSi
3040: 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f  ze is correct */
3050: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3070: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
3080: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
3090: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
30a0: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
30b0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
30c0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
30d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
30e0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
30f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3100: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3110: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3120: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72  file */.  int er
3130: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
3140: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
3150: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
3160: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
3170: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
3180: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3190: 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e  s journalled sin
31a0: 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72  ce last j-header
31b0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33   written */.  u3
31c0: 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  2 cksumInit;    
31d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
31e0: 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  si-random value 
31f0: 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63  added to every c
3200: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32  hecksum */.  u32
3210: 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20   nSubRec;       
3220: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3230: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72  er of records wr
3240: 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75  itten to sub-jou
3250: 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63  rnal */.  Bitvec
3260: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
3270: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
3280: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
3290: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
32a0: 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
32b0: 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
32c0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
32d0: 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61  criptor for data
32e0: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
32f0: 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
3300: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
3310: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69  scriptor for mai
3320: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73  n journal */.  s
3330: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66  qlite3_file *sjf
3340: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  d;         /* Fi
3350: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
3360: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  r sub-journal */
3370: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66  .  i64 journalOf
3380: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
3390: 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20  * Current write 
33a0: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
33b0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
33c0: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
33e0: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
33f0: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
3400: 65 61 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72  eader */.  Pager
3410: 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65  Savepoint *aSave
3420: 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20  point; /* Array 
3430: 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  of active savepo
3440: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  ints */.  int nS
3450: 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
3460: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3470: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
3480: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20  Savepoint[] */. 
3490: 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
34a0: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  [16];        /* 
34b0: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
34c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
34d0: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20  hanges */.  u32 
34e0: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
3500: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64  ed sector size d
3510: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a  uring rollback *
3520: 2f 0a 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  /..  int nExtra;
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
3550: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
3560: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
3570: 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73  /.  u32 vfsFlags
3580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3590: 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c  /* Flags for sql
35a0: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
35b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
35c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
35d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
35e0: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
35f0: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b  /.  Pgno mxPgno;
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
3620: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ed size of the d
3630: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
3640: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
3650: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3660: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3670: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
3680: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
3690: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
36a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
36b0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  le */.  int (*xB
36c0: 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
36d0: 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  *); /* Function 
36e0: 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73  to call when bus
36f0: 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  y */.  void *pBu
3700: 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20  syHandlerArg;   
3710: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72     /* Context ar
3720: 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79  gument for xBusy
3730: 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65  Handler */.#ifde
3740: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
3750: 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b  int nHit, nMiss;
3760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3770: 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69  ache hits and mi
3780: 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e  ssing */.  int n
3790: 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20  Read, nWrite;   
37a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
37b0: 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72  se pages read/wr
37c0: 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a  itten */.#endif.
37d0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
37e0: 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a  er)(DbPage*); /*
37f0: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
3800: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
3810: 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65  g pages */.#ifde
3820: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
3830: 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  EC.  void *(*xCo
3840: 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
3850: 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52  ,Pgno,int); /* R
3860: 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65  outine for en/de
3870: 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20  coding data */. 
3880: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
3890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
38a0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
38b0: 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65  o xCodec() */.#e
38c0: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
38d0: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
38e0: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
38f0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
3900: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
3910: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
3920: 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20  SizeLimit;      
3930: 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66   /* Size limit f
3940: 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  or persistent jo
3950: 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20  urnal files */. 
3960: 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65   PCache *pPCache
3970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3980: 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  Pointer to page 
3990: 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cache object */.
39a0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
39b0: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
39c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
39d0: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
39e0: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
39f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  };../*.** The fo
3a00: 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
3a10: 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f  ariables hold co
3a20: 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a  unters used for.
3a30: 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  ** testing purpo
3a40: 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65  ses only.  These
3a50: 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f   variables do no
3a60: 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20  t exist in.** a 
3a70: 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c  non-testing buil
3a80: 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  d.  These variab
3a90: 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65  les are not thre
3aa0: 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64  ad-safe..*/.#ifd
3ab0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
3ac0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3ad0: 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20  _readdb_count = 
3ae0: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
3af0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65  of full pages re
3b00: 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e  ad from DB */.in
3b10: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
3b20: 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20  writedb_count = 
3b30: 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
3b40: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69  f full pages wri
3b50: 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e  tten to DB */.in
3b60: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
3b70: 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30  writej_count = 0
3b80: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
3b90: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
3ba0: 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20  to journal */.# 
3bb0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
3bc0: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
3bd0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
3be0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
3bf0: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
3c00: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
3c10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3c20: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
3c30: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
3c40: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
3c50: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
3c60: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
3c70: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
3c80: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
3c90: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
3ca0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
3cb0: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
3cc0: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
3cd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
3ce0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
3cf0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
3d00: 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20  nal is being.** 
3d10: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
3d20: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
3d30: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
3d40: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
3d50: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
3d60: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
3d70: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
3d80: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
3d90: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
3da0: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
3db0: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
3dc0: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
3dd0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
3de0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
3df0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
3e00: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
3e10: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
3e20: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
3e30: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
3e40: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
3e50: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
3e60: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
3e70: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
3e80: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
3e90: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
3ea0: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
3eb0: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
3ec0: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
3ed0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
3ee0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
3ef0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
3f00: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
3f10: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
3f20: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
3f30: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
3f40: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
3f50: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
3f60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
3f70: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
3f80: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
3f90: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
3fa0: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
3fb0: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
3fc0: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
3fd0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
3fe0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
3ff0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
4000: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
4010: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
4020: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
4030: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
4040: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
4050: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
4060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
4070: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
4080: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
4090: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
40a0: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
40b0: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
40c0: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
40d0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
40e0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
40f0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
4100: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
4110: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4120: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
4130: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
4140: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
4150: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
4160: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
4170: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
4180: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65   of each page re
4190: 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  cord in the jour
41a0: 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a  nal is given by.
41b0: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
41c0: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69   macro..*/.#defi
41d0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
41e0: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
41f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
4200: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
4210: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
4220: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
4230: 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c  . This is usuall
4240: 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73  y the same .** s
4250: 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20  ize as a single 
4260: 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65  disk sector. See
4270: 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53   also setSectorS
4280: 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ize()..*/.#defin
4290: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
42a0: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
42b0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
42c0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
42d0: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
42e0: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
42f0: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
4300: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
4310: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
4320: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
4330: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
4340: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
4350: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
4360: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
4370: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
4380: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
4390: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
43a0: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
43b0: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
43c0: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
43d0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
43e0: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
43f0: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
4400: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
4410: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
4420: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4430: 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
4440: 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29  er is (2^31 - 1)
4450: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
4460: 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37  ER_MAX_PGNO 2147
4470: 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66 20  483647..#ifndef 
4480: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
4490: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
44a0: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
44b0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
44c0: 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  );.*/.static int
44d0: 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
44e0: 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
44f0: 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d 70  r){..  /* A temp
4500: 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20  -file is always 
4510: 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  in PAGER_EXCLUSI
4520: 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e 43  VE or PAGER_SYNC
4530: 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61  ED state. */.  a
4540: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
4550: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
4560: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
4570: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
4580: 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67 65  .  /* The change
4590: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
45a0: 73 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f 72  s always set for
45b0: 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a 20   temp-files */. 
45c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
45d0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
45e0: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
45f0: 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72 65  untDone );..  re
4600: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
4610: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4620: 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65 63  rue if it is nec
4630: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
4640: 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74  page *pPg into t
4650: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
4660: 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73 20  ** A page needs 
4670: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
4680: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
4690: 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69 73  al if there exis
46a0: 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72  ts one.** or mor
46b0: 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  e open savepoint
46c0: 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a  s for which:.**.
46d0: 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d  **   * The page-
46e0: 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
46f0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
4700: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e  PagerSavepoint.n
4710: 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  Orig, and.**   *
4720: 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   The bit corresp
4730: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  onding to the pa
4740: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74  ge-number is not
4750: 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50   set in.**     P
4760: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
4770: 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  nSavepoint..*/.s
4780: 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65  tatic int subjRe
4790: 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64 72  quiresPage(PgHdr
47a0: 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70   *pPg){.  Pgno p
47b0: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
47c0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
47d0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
47e0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
47f0: 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53  =0; i<pPager->nS
4800: 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a  avepoint; i++){.
4810: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
4820: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
4830: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a  >aSavepoint[i];.
4840: 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67      if( p->nOrig
4850: 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c  >=pgno && 0==sql
4860: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4870: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
4880: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
4890: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
48a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
48b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
48c0: 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20  rue if the page 
48d0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
48e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
48f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4900: 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64  geInJournal(PgHd
4910: 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  r *pPg){.  retur
4920: 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  n sqlite3BitvecT
4930: 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d  est(pPg->pPager-
4940: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
4950: 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pgno);.}../*.*
4960: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
4970: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
4980: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
4990: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
49a0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
49b0: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
49c0: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
49d0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
49e0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
49f0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
4a00: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4a10: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4a20: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
4a30: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
4a40: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
4a50: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
4a60: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
4a70: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
4a80: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
4a90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4aa0: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
4ab0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
4ac0: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
4ad0: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
4ae0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4af0: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
4b00: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
4b10: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
4b20: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
4b30: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4b40: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
4b50: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
4b60: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
4b70: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
4b80: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
4b90: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
4ba0: 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a  (u8*)A,B)../*.**
4bb0: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
4bc0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
4bd0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
4be0: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
4bf0: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
4c00: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
4c10: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
4c20: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
4c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4c40: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
4c50: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
4c60: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
4c70: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
4c80: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
4c90: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
4ca0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
4cb0: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
4cc0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  t);.}../*.** The
4cd0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
4ce0: 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c  s macro is a fil
4cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79  e descriptor (ty
4d00: 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  pe sqlite3_file*
4d10: 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  )..** Return 0 i
4d20: 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  f it is not open
4d30: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62  , or non-zero (b
4d40: 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20  ut not 1) if it 
4d50: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  is..**.** This i
4d60: 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73  s so that expres
4d70: 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69  sions can be wri
4d80: 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  tten as:.**.**  
4d90: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
4da0: 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a  er->jfd) ){ ....
4db0: 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  **.** instead of
4dc0: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61  .**.**   if( pPa
4dd0: 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
4de0: 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65  ds ){ ....*/.#de
4df0: 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29  fine isOpen(pFd)
4e00: 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64   ((pFd)->pMethod
4e10: 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c  s)../*.** If fil
4e20: 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63  e pFd is open, c
4e30: 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  all sqlite3OsUnl
4e40: 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a  ock() on it..*/.
4e50: 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c  static int osUnl
4e60: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
4e70: 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b   *pFd, int eLock
4e80: 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  ){.  if( !isOpen
4e90: 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65 74  (pFd) ){.    ret
4ea0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
4eb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
4ec0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c  te3OsUnlock(pFd,
4ed0: 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   eLock);.}../*.*
4ee0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4ef0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
4f00: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
4f10: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
4f20: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ization.** can b
4f30: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
4f40: 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69   pager. The opti
4f50: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
4f60: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
4f70: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
4f80: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
4f90: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
4fa0: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
4fb0: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
4fc0: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
4fd0: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
4fe0: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
4ff0: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
5000: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
5010: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
5020: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
5030: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
5040: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   size..**.** The
5050: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
5060: 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61   also always ena
5070: 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  bled for tempora
5080: 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a  ry files. It is.
5090: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63  ** an error to c
50a0: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
50b0: 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f  n if pPager is o
50c0: 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d  pened on an in-m
50d0: 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
50e0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
50f0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
5100: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
5110: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
5120: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
5130: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
5140: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
5150: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
5160: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
5170: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
5180: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
5190: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
51a0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
51b0: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
51c0: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
51d0: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
51e0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
51f0: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
5200: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  B );.  if( !pPag
5210: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
5220: 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20      int dc;     
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
5250: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
5260: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74  */.    int nSect
5270: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
5280: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74           /* Sect
5290: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69  or size */.    i
52a0: 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20  nt szPage;      
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f   /* Page size */
52d0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
52e0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
52f0: 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c   );.    dc = sql
5300: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
5310: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
5320: 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65  er->fd);.    nSe
5330: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
5340: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73  ectorSize;.    s
5350: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
5360: 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61  pageSize;..    a
5370: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
5380: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
5390: 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73  12>>8));.    ass
53a0: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
53b0: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
53c0: 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28  36>>8));.    if(
53d0: 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f   0==(dc&(SQLITE_
53e0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
53f0: 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65  Page>>8)) || nSe
5400: 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a  ctor>szPage) ){.
5410: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
5420: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
5430: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
5440: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
5450: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
5460: 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  r);.}.#endif../*
5470: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
5480: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
5490: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
54a0: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
54b0: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
54c0: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
54d0: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
54e0: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
54f0: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
5500: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
5510: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
5520: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
5530: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
5540: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
5550: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
5560: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
5570: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
5580: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
5590: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
55a0: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
55b0: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
55c0: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
55d0: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
55e0: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
55f0: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
5600: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
5610: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
5620: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
5630: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
5640: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
5650: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
5660: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
5670: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
5680: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
5690: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
56a0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
56b0: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
56c0: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
56d0: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
56e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
56f0: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
5700: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
5710: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
5720: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
5730: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
5740: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
5750: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
5760: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
5770: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
5780: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
5790: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
57a0: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
57b0: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
57c0: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
57d0: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
57e0: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
57f0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
5800: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
5810: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
5820: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
5830: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
5840: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
5850: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
5860: 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  || (pPg->flags&P
5870: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
5880: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
5890: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
58a0: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
58b0: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
58c0: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
58d0: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
58e0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
58f0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
5900: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
5910: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
5920: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
5930: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
5940: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
5950: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
5960: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
5970: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
5980: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
5990: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
59a0: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
59b0: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
59c0: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
59d0: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
59e0: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
59f0: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
5a00: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
5a10: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
5a20: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
5a30: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
5a40: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
5a50: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
5a60: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
5a70: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
5a80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5a90: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
5aa0: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
5ab0: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
5ac0: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
5ad0: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
5ae0: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
5af0: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
5b00: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
5b10: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
5b20: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
5b30: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
5b40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5b50: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
5b60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
5b70: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
5b80: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
5b90: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
5ba0: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
5bb0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
5bc0: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
5bd0: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
5be0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5bf0: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
5c00: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
5c10: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
5c20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5c30: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
5c40: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
5c50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
5c60: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
5c70: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
5c80: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
5c90: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
5ca0: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
5cb0: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
5cc0: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
5cd0: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
5ce0: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
5cf0: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
5d00: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
5d10: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
5d20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5d30: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
5d40: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
5d50: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
5d60: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
5d70: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
5d80: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
5d90: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
5da0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
5db0: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
5dc0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
5dd0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
5de0: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
5df0: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
5e00: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
5e10: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
5e20: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
5e30: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
5e40: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
5e50: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
5e60: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
5e70: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
5e80: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
5e90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5ea0: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
5ed0: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
5ee0: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
5ef0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f10: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
5f20: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
5f30: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f50: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
5f60: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
5f70: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5f80: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
5f90: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
5fa0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
5fb0: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
5fc0: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
5fd0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
5fe0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
5ff0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
6000: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
6010: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
6020: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
6030: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
6040: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
6050: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
6060: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
6070: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
6080: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
6090: 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  sum)).   || SQLI
60a0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
60b0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
60c0: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
60d0: 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d  -8)).   || memcm
60e0: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
60f0: 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c  alMagic, 8).   |
6100: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
6110: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
6120: 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c  (pJrnl, zMaster,
6130: 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e   len, szJ-16-len
6140: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
6150: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
6160: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
6170: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
6180: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6190: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d  name */.  for(u=
61a0: 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a  0; u<len; u++){.
61b0: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61      cksum -= zMa
61c0: 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69  ster[u];.  }.  i
61d0: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
61e0: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
61f0: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
6200: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
6210: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
6220: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
6230: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
6240: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
6250: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
6260: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
6270: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
6280: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
6290: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
62a0: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
62b0: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
62c0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
62d0: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
62e0: 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a     len = 0;.  }.
62f0: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
6300: 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74   '\0';.   .  ret
6310: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6320: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6330: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
6340: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
6350: 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65   at or immediate
6360: 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  ly .** following
6370: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50   the value in pP
6380: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6390: 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63  , assuming a sec
63a0: 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  tor .** size of 
63b0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
63c0: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
63d0: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
63e0: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
63f0: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72  .**   Pager.jour
6400: 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20  nalOff          
6410: 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  Return value.** 
6420: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30  ---------.**   0
6450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6460: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20           0.**   
6470: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
6480: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
6490: 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20     100          
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
64b0: 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20  .**   2000      
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
64e0: 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  ic i64 journalHd
64f0: 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70  rOffset(Pager *p
6500: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
6510: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
6520: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
6530: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
6540: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
6550: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
6560: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
6570: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
6580: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
6590: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
65a0: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
65b0: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
65c0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
65d0: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
65e0: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
65f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6600: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66  ) );.  return of
6610: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
6620: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6630: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
6640: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
6650: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
6660: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6670: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
6680: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
6690: 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74  s not been writt
66a0: 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20  en to.** within 
66b0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
66c0: 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66  saction (i.e. if
66d0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
66e0: 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f==0)..**.** If 
66f0: 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f  doTruncate is no
6700: 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61  n-zero or the Pa
6710: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
6720: 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73  imit variable is
6730: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68  .** set to 0, th
6740: 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  en truncate the 
6750: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
6760: 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69  zero bytes in si
6770: 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  ze. Otherwise,.*
6780: 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79  * zero the 28-by
6790: 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65  te header at the
67a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
67b0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65  urnal file. In e
67c0: 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20  ither case, .** 
67d0: 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
67e0: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
67f0: 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
6800: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64  urnal file immed
6810: 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72  iately .** after
6820: 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e   writing or trun
6830: 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  cating it..**.**
6840: 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   If Pager.journa
6850: 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65  lSizeLimit is se
6860: 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c  t to a positive,
6870: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
6880: 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   and.** followin
6890: 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  g the truncation
68a0: 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63   or zeroing desc
68b0: 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20  ribed above the 
68c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
68d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
68e0: 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20  bytes is larger 
68f0: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
6900: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
6910: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
6920: 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72  le to Pager.jour
6930: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74  nalSizeLimit byt
6940: 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  es. The journal 
6950: 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  file does.** not
6960: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63   need to be sync
6970: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ed following thi
6980: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  s operation..**.
6990: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
69a0: 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f  r occurs, abando
69b0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
69c0: 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65   return the IO e
69d0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74  rror code..** Ot
69e0: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
69f0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
6a00: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
6a10: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
6a20: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
6a30: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
6a40: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6a70: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
6a80: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
6a90: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
6aa0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
6ab0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
6ac0: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
6ad0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
6ae0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
6af0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
6b00: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
6b10: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
6b20: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
6b30: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
6b40: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
6b50: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
6b60: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
6b70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
6b80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6b90: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
6ba0: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
6bb0: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
6bc0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
6bd0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
6be0: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
6bf0: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
6c00: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
6c10: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
6c20: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
6c30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6c40: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
6c50: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
6c60: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
6c70: 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
6c80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74    }..    /* At t
6c90: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72  his point the tr
6ca0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6cb0: 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77  mitted but the w
6cc0: 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a  rite lock .    *
6cd0: 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  * is still held 
6ce0: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  on the file. If 
6cf0: 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20  there is a size 
6d00: 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64  limit configured
6d10: 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65   for .    ** the
6d20: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
6d30: 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  nal and the jour
6d40: 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
6d50: 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65  ly consumes more
6d60: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68  .    ** space th
6d70: 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c  an that limit al
6d80: 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61  lows for, trunca
6d90: 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65  te it now. There
6da0: 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
6db0: 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66  ** to sync the f
6dc0: 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ile following th
6dd0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
6de0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
6df0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
6e00: 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  imit>0 ){.      
6e10: 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63  i64 sz;.      rc
6e20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
6e30: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
6e40: 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66  , &sz);.      if
6e50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6e60: 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a  && sz>iLimit ){.
6e70: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
6e80: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
6e90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d  Pager->jfd, iLim
6ea0: 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  it);.      }.   
6eb0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6ec0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
6ed0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
6ee0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
6ef0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6f00: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
6f10: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
6f20: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
6f30: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
6f40: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
6f50: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
6f60: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
6f70: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
6f80: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
6f90: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
6fa0: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
6fb0: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
6fc0: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
6fd0: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
6fe0: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
6ff0: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
7000: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
7010: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
7020: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
7030: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
7040: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
7050: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
7060: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
7070: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
7080: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
7090: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
70a0: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
70b0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
70c0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74  * - 4 bytes: Dat
70d0: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e  abase page size.
70e0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
70f0: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
7100: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
7110: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
7120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
7130: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
7140: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7150: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7160: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
7170: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
7180: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ode */.  char *z
7190: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
71a0: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20  >pTmpSpace;  /* 
71b0: 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20  Temporary space 
71c0: 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65  used to build he
71d0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48  ader */.  u32 nH
71e0: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
71f0: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  pageSize;     /*
7200: 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
7210: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48  pointed to by zH
7220: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
7230: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7250: 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65  * Bytes of heade
7260: 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e  r sector written
7270: 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
72a0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
72b0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
72c0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
72d0: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
72e0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
72f0: 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61  . */..  if( nHea
7300: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
7310: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
7320: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
7330: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7340: 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
7350: 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
7360: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
7370: 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72   any of them wer
7380: 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20  e created .  ** 
7390: 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72  since the most r
73a0: 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65  ecent journal he
73b0: 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e  ader was written
73c0: 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20  , update the .  
73d0: 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
73e0: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
73f0: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
7400: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
7410: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
7420: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
7430: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
7440: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
7450: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
7460: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
7470: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
7480: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
7490: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
74a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
74b0: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
74c0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
74d0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
74e0: 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ager);.  memcpy(
74f0: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
7500: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
7510: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
7520: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
7530: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
7540: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
7550: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
7560: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
7570: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
7580: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
7590: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
75a0: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
75b0: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
75c0: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
75d0: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
75e0: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
75f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
7600: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
7610: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
7620: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
7630: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
7640: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
7650: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
7660: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
7670: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
7680: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
7690: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
76a0: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
76b0: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
76c0: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
76d0: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
76e0: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
76f0: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
7700: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
7710: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7720: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
7730: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
7740: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
7750: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
7760: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
7770: 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  e occured whilst
7780: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
7790: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
77a0: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
77b0: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
77c0: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
77d0: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
77e0: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
77f0: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
7800: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
7810: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
7820: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
7830: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
7840: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
7850: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
7860: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
7870: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
7880: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
7890: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
78a0: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
78b0: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
78c0: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
78d0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
78e0: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
78f0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
7900: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
7910: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
7920: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
7930: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
7940: 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( (pPager->noSyn
7950: 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  c) || (pPager->j
7960: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
7970: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
7980: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
7990: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
79a0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
79b0: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
79c0: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
79d0: 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33  ) .  ){.    put3
79e0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
79f0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7a00: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
7a10: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
7a20: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
7a30: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
7a40: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a  nalMagic)], 0);.
7a50: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
7a60: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
7a70: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
7a80: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
7a90: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
7aa0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
7ab0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
7ac0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
7ad0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7ae0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7af0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
7b00: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
7b10: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
7b20: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
7b30: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7b40: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7b50: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
7b60: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
7b70: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
7b80: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
7b90: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
7ba0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
7bb0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
7bc0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
7bd0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
7be0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
7bf0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
7c00: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
7c10: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7c20: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
7c30: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
7c40: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
7c50: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
7c60: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
7c70: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
7c80: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
7c90: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
7ca0: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
7cb0: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
7cc0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
7cd0: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
7ce0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
7cf0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
7d00: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
7d10: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
7d20: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
7d30: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
7d40: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
7d50: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7d60: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
7d70: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
7d80: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7d90: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
7da0: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
7db0: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
7dc0: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
7dd0: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
7de0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
7df0: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
7e00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7e10: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
7e20: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
7e30: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
7e40: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
7e50: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
7e60: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
7e70: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
7e80: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
7e90: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
7ea0: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
7eb0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
7ec0: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
7ed0: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
7ee0: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
7ef0: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
7f00: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
7f10: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
7f20: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
7f30: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
7f40: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
7f50: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
7f60: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
7f70: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
7f80: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
7f90: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
7fa0: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
7fb0: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
7fc0: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
7fd0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
7fe0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
7ff0: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
8000: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
8010: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
8020: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
8030: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
8040: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
8050: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
8060: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
8070: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
8080: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
8090: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
80a0: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
80b0: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
80c0: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
80d0: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
80e0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
80f0: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
8100: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
8110: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
8120: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
8130: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
8140: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
8150: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
8160: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
8170: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
8180: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
8190: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
81a0: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
81b0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
81c0: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
81d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
81e0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
81f0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
8200: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
8210: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
8220: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8230: 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20  ff += nHeader;. 
8240: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
8250: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
8260: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
8270: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
8280: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
8290: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
82a0: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
82b0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
82c0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
82d0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
82e0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
82f0: 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65   file. The curre
8300: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
8310: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8320: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  is given by.** p
8330: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8340: 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  f. See comments 
8350: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
8360: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
8370: 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69   for.** a descri
8380: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  ption of the jou
8390: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
83a0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
83b0: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
83c0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70  successfully, *p
83d0: 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  NRec is set to t
83e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
83f0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
8400: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
8410: 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20  er and *pDbSize 
8420: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
8430: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
8440: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
8450: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
8460: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
8470: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
8480: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
8490: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
84a0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
84b0: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
84c0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
84d0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
84e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
84f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
8500: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
8510: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
8520: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
8530: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65  turned and *pNRe
8540: 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61  c and *PDbSize a
8550: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49  re undefined.  I
8560: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
8570: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
8580: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
8590: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
85a0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
85b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
85c0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
85d0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
85e0: 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
85f0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
8600: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20  object */.  i64 
8610: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20  journalSize,    
8620: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
8630: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
8640: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
8650: 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52  es */.  u32 *pNR
8660: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
8670: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
8680: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
8690: 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20   nRec field */. 
86a0: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20   u32 *pDbSize   
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
86c0: 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f   OUT: Value of o
86d0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
86e0: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29   size field */.)
86f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8720: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
8730: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
8740: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
8750: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
8760: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
8770: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
8780: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8790: 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  et of journal he
87a0: 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20  ader being read 
87b0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
87c0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
87d0: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
87e0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
87f0: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a  e open. */..  /*
8800: 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a   Advance Pager.j
8810: 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65  ournalOff to the
8820: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
8830: 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68  xt sector. If th
8840: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
8850: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
8860: 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
8870: 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64   a header stored
8880: 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
8890: 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  int, return SQLI
88a0: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20  TE_DONE..  */.  
88b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
88c0: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
88d0: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
88e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
88f0: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
8900: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
8910: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
8920: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8930: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48  E_DONE;.  }.  iH
8940: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
8950: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
8960: 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69  * Read in the fi
8970: 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
8980: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8990: 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f  r. If they do no
89a0: 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65  t match.  ** the
89b0: 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66    magic string f
89c0: 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72  ound at the star
89d0: 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61  t of each journa
89e0: 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e  l header, return
89f0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
8a00: 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  E. If an IO erro
8a10: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
8a20: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
8a30: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20  Otherwise,.  ** 
8a40: 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
8a50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8a60: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
8a70: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
8a80: 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29  Magic), iHdrOff)
8a90: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
8aa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8ab0: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
8ac0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8ad0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
8ae0: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ic))!=0 ){.    r
8af0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8b00: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  E;.  }..  /* Rea
8b10: 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  d the first thre
8b20: 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20  e 32-bit fields 
8b30: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
8b40: 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a  eader: The nRec.
8b50: 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20    ** field, the 
8b60: 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c  checksum-initial
8b70: 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74  izer and the dat
8b80: 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68  abase size at th
8b90: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
8ba0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
8bb0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
8bc0: 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
8bd0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20  g goes wrong..  
8be0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
8bf0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8c00: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8c10: 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52  , iHdrOff+8, pNR
8c20: 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ec)).   || SQLIT
8c30: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8c40: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8c50: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20  fd, iHdrOff+12, 
8c60: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
8c70: 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  it)).   || SQLIT
8c80: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8c90: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8ca0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20  fd, iHdrOff+16, 
8cb0: 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20  pDbSize)).  ){. 
8cc0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8cd0: 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
8ce0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
8cf0: 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53  {.    u32 iPageS
8d00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8d10: 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20     /* Page-size 
8d20: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
8d30: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
8d40: 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  32 iSectorSize; 
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8d60: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
8d70: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
8d80: 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50  er */.    u16 iP
8d90: 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20  ageSize16;      
8da0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
8db0: 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31  f iPageSize in 1
8dc0: 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a  6-bit variable *
8dd0: 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
8de0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
8df0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
8e00: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
8e10: 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
8e20: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
8e30: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
8e40: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
8e50: 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
8e60: 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
8e70: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e80: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8e90: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
8ea0: 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
8eb0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8ec0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
8ed0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
8ee0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
8ef0: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
8f00: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
8f10: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
8f20: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
8f30: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
8f40: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
8f50: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
8f60: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
8f70: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
8f80: 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20 61 6e  equal to 512, an
8f90: 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
8fa0: 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
8fb0: 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
8fc0: 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
8fd0: 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
8fe0: 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
8ff0: 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
9000: 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
9010: 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20 7c  rSize<512.     |
9020: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
9030: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
9040: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
9050: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
9060: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
9070: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
9080: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
9090: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
90a0: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
90b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
90c0: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
90d0: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
90e0: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
90f0: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
9100: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
9110: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
9120: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
9130: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
9140: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
9150: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
9160: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
9170: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
9180: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
9190: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
91a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
91b0: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
91c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
91d0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
91e0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
91f0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
9200: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
9210: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
9220: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
9230: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
9240: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
9250: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
9260: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
9270: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
9280: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
9290: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
92a0: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
92b0: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
92c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
92d0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
92e0: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
92f0: 31 36 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  16);.    testcas
9300: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
9310: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9320: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
9330: 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28 75   iPageSize16==(u
9340: 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b 0a  16)iPageSize );.
9350: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
9360: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
9370: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
9380: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
9390: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
93a0: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
93b0: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
93c0: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
93d0: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
93e0: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
93f0: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
9400: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
9410: 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
9420: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
9430: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
9440: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
9450: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
9460: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
9470: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
9480: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
9490: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
94a0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
94b0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
94c0: 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
94d0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
94e0: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
94f0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9500: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9510: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
9520: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
9530: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
9540: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
9550: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
9560: 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
9570: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
9580: 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
9590: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
95a0: 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
95b0: 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
95c0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
95d0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
95e0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
95f0: 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
9600: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
9610: 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
9620: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
9630: 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
9640: 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
9650: 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
9660: 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
9670: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
9680: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
9690: 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
96a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
96b0: 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
96c0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
96d0: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
96e0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
96f0: 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
9700: 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
9710: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
9720: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
9730: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
9740: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
9750: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
9760: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
9770: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
9780: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
9790: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
97a0: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
97b0: 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
97c0: 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
97d0: 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
97e0: 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
97f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
9800: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
9810: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
9820: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
9830: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
9840: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
9850: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
9860: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
9870: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
9880: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
9890: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
98a0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
98d0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
98e0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
98f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
9900: 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
9910: 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
9920: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
9930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
9940: 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
9950: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
9960: 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
9970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9980: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
99a0: 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
99b0: 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
99c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
99d0: 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
99e0: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 69   zMaster */..  i
99f0: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
9a00: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9a10: 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
9a20: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9a30: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
9a40: 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67  MORY .   || pPag
9a50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
9a60: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9a70: 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20  DE_OFF .  ){.   
9a80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9a90: 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
9aa0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
9ab0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
9ac0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
9ad0: 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
9ae0: 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62   the length in b
9af0: 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65  ytes and the che
9b00: 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72  cksum of zMaster
9b10: 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65   */.  for(nMaste
9b20: 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  r=0; zMaster[nMa
9b30: 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b  ster]; nMaster++
9b40: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
9b50: 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
9b60: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
9b70: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
9b80: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
9b90: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
9ba0: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
9bb0: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
9bc0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
9bd0: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
9be0: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
9bf0: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
9c00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
9c10: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
9c20: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
9c30: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
9c40: 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
9c50: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
9c60: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
9c70: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48  Pager);.  }.  iH
9c80: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
9c90: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
9ca0: 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
9cb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20  er journal data 
9cc0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
9cd0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
9ce0: 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  If.  ** an error
9cf0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
9d00: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
9d10: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
9d20: 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28  */.  if( (0 != (
9d30: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
9d40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
9d50: 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  drOff, PAGER_MJ_
9d60: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a  PGNO(pPager)))).
9d70: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
9d80: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
9d90: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
9da0: 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20  aster, nMaster, 
9db0: 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20  iHdrOff+4))).   
9dc0: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
9dd0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
9de0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
9df0: 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  4+nMaster, nMast
9e00: 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  er))).   || (0 !
9e10: 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
9e20: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
9e30: 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
9e40: 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20  er+4, cksum))). 
9e50: 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
9e60: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
9e70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
9e80: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69  urnalMagic, 8, i
9e90: 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
9ea0: 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
9eb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
9ec0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9ed0: 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
9ee0: 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  0);.  pPager->ne
9ef0: 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
9f00: 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20  ->noSync;..  /* 
9f10: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
9f20: 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75  in peristent-jou
9f30: 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20  rnal mode, then 
9f40: 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20  the physical .  
9f50: 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ** journal-file 
9f60: 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20  may extend past 
9f70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
9f80: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
9f90: 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79  me.  ** and 8 by
9fa0: 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74  tes of magic dat
9fb0: 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74  a just written t
9fc0: 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  o the file. This
9fd0: 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72   is .  ** danger
9fe0: 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20  ous because the 
9ff0: 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  code to rollback
a000: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
a010: 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ile.  ** will no
a020: 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e  t be able to fin
a030: 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  d the master-jou
a040: 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74  rnal name to det
a050: 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65  ermine .  ** whe
a060: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
a070: 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20  journal is hot. 
a080: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65  .  **.  ** Easie
a090: 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69  st thing to do i
a0a0: 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  n this scenario 
a0b0: 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  is to truncate t
a0c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
a0d0: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71   file to the req
a0e0: 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f  uired size..  */
a0f0: 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f   .  if( SQLITE_O
a100: 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
a110: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
a120: 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a  r->jfd, &jrnlSiz
a130: 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69  e)).   && jrnlSi
a140: 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ze>pPager->journ
a150: 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72  alOff.  ){.    r
a160: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
a170: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
a180: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
a190: 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65  alOff);.  }.  re
a1a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a1b0: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
a1c0: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
a1d0: 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
a1e0: 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a  umber. Return.**
a1f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
a200: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
a210: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
a220: 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  page is not .** 
a230: 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72  already in memor
a240: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  y..*/.static PgH
a250: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
a260: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a270: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
a280: 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
a2b0: 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e  */..  /* It is n
a2c0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
a2d0: 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68 65  a call to Pcache
a2e0: 46 65 74 63 68 28 29 20 77 69 74 68 20 63 72 65  Fetch() with cre
a2f0: 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20  ateFlag==0 to.  
a300: 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e  ** fail, since n
a310: 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  o attempt to all
a320: 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65  ocate dynamic me
a330: 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64  mory will be mad
a340: 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29  e..  */.  (void)
a350: 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
a360: 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
a370: 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29  he, pgno, 0, &p)
a380: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
a390: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 74 68  ./*.** Unless th
a3a0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72  e pager is in er
a3b0: 72 6f 72 2d 73 74 61 74 65 2c 20 64 69 73 63 61  ror-state, disca
a3c0: 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  rd all in-memory
a3d0: 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20 74 68   pages. If.** th
a3e0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72  e pager is in er
a3f0: 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 65 6e 20  ror-state, then 
a400: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
a410: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  o-op..**.** TODO
a420: 3a 20 57 68 79 20 63 61 6e 20 77 65 20 6e 6f 74  : Why can we not
a430: 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72   reset the pager
a440: 20 77 68 69 6c 65 20 69 6e 20 65 72 72 6f 72 20   while in error 
a450: 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61 74 69 63  state?.*/.static
a460: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
a470: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
a480: 7b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  {.  if( SQLITE_O
a490: 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  K==pPager->errCo
a4a0: 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
a4b0: 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
a4c0: 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
a4d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
a4e0: 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  heClear(pPager->
a4f0: 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 7d 0a  pPCache);.  }.}.
a500: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
a510: 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
a520: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
a530: 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
a540: 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
a550: 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
a560: 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
a570: 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
a580: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
a590: 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
a5a0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
a5b0: 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
a5c0: 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
a5d0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
a5e0: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
a5f0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
a600: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
a610: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
a620: 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
a630: 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
a640: 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
a650: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
a660: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
a670: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
a680: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
a690: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
a6a0: 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
a6b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
a6c0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
a6d0: 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
a6e0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
a6f0: 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >sjfd);.  }.  sq
a700: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
a710: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r->aSavepoint);.
a720: 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
a730: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
a740: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
a750: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
a760: 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ubRec = 0;.}../*
a770: 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20  .** Set the bit 
a780: 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74  number pgno in t
a790: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
a7a0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a  t.pInSavepoint .
a7b0: 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c  ** bitvecs of al
a7c0: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
a7d0: 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  s. Return SQLITE
a7e0: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
a7f0: 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  l.** or SQLITE_N
a800: 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
a810: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
a820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
a830: 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
a840: 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67  vecs(Pager *pPag
a850: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
a860: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
a870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a880: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
a890: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a8a0: 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  _OK;       /* Re
a8b0: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  sult code */..  
a8c0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
a8d0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
a8e0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65   ii++){.    Page
a8f0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
a900: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
a910: 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  int[ii];.    if(
a920: 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20   pgno<=p->nOrig 
a930: 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73  ){.      rc |= s
a940: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
a950: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
a960: 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65   pgno);.      te
a970: 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
a980: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
a990: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
a9a0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
a9b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
a9c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a9d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
a9e0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
a9f0: 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 66 75  se file. This fu
aa00: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
aa10: 70 20 69 66 20 74 68 65 20 70 61 67 65 72 0a 2a  p if the pager.*
aa20: 2a 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  * is in exclusiv
aa30: 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e mode..**.** If
aa40: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75   the pager is cu
aa50: 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72  rrently in error
aa60: 20 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20   state, discard 
aa70: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
aa80: 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e  .** the cache an
aa90: 64 20 72 65 73 65 74 20 74 68 65 20 50 61 67 65  d reset the Page
aaa0: 72 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 65  r structure inte
aab0: 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74  rnal state. If t
aac0: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70  here is.** an op
aad0: 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c  en journal-file,
aae0: 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74   then the next t
aaf0: 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63  ime a shared-loc
ab00: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  k is obtained.**
ab10: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66 69   on the pager fi
ab20: 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72 20 61  le (by this or a
ab30: 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
ab40: 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a  ), it will be.**
ab50: 20 74 72 65 61 74 65 64 20 61 73 20 61 20 68 6f   treated as a ho
ab60: 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f  t-journal and ro
ab70: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
ab80: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
ab90: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
aba0: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
abb0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
abc0: 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
abd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
abe0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
abf0: 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f  n code */..    /
ac00: 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74  * Always close t
ac10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ac20: 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
ac30: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
ac40: 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  .    ** Otherwis
ac50: 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  e, another conne
ac60: 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
ac70: 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
ac80: 69 67 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65  ight.    ** dele
ac90: 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20  te the file out 
aca0: 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
acb0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
acc0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
acd0: 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  >jfd);.    sqlit
ace0: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
acf0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
ad00: 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
ad10: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
ad20: 0a 20 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  .    releaseAllS
ad30: 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
ad40: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
ad50: 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
ad60: 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73  ed, somebody els
ad70: 65 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69  e might change i
ad80: 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 76 61  t. The.    ** va
ad90: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 50  lues stored in P
ada0: 61 67 65 72 2e 64 62 53 69 7a 65 20 65 74 63 2e  ager.dbSize etc.
adb0: 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 69 6e   might become in
adc0: 76 61 6c 69 64 20 69 66 0a 20 20 20 20 2a 2a 20  valid if.    ** 
add0: 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 54 4f  this happens. TO
ade0: 44 4f 3a 20 52 65 61 6c 6c 79 2c 20 74 68 69 73  DO: Really, this
adf0: 20 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f   doesn't need to
ae00: 20 62 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20   be cleared.    
ae10: 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61  ** until the cha
ae20: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63  nge-counter chec
ae30: 6b 20 66 61 69 6c 73 20 69 6e 20 70 61 67 65 72  k fails in pager
ae40: 53 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20  SharedLock()..  
ae50: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
ae60: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
ae70: 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 55 6e  ;..    rc = osUn
ae80: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
ae90: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69   NO_LOCK);.    i
aea0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 70  f( rc ){.      p
aeb0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
aec0: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49   rc;.    }.    I
aed0: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
aee0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
aef0: 0a 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72  .    /* If Pager
af00: 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
af10: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
af20: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
af30: 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a   cannot be.    *
af40: 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74  * trusted. Now t
af50: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 66 69  hat the pager fi
af60: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20  le is unlocked, 
af70: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
af80: 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  the.    ** cache
af90: 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65   can be discarde
afa0: 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20  d and the error 
afb0: 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61  code safely clea
afc0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
afd0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
afe0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ode ){.      if(
aff0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b000: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
b010: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
b020: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
b030: 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
b040: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
b050: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
b060: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
b070: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
b080: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
b090: 43 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  CK;.  }.}../*.**
b0a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
b0b0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
b0c0: 77 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43  when an IOERR, C
b0d0: 4f 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65  ORRUPT or FULL e
b0e0: 72 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65  rror.** may have
b0f0: 20 6f 63 63 75 72 65 64 2e 20 54 68 65 20 66 69   occured. The fi
b100: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
b110: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b120: 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63   pager .** struc
b130: 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
b140: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
b150: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
b160: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
b170: 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  .** API function
b180: 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
b190: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
b1a0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
b1b0: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69  ument .** to thi
b1c0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
b1d0: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
b1e0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
b1f0: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
b200: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
b210: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
b220: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
b230: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
b240: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
b250: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
b260: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
b270: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
b280: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
b290: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
b2a0: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
b2b0: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
b2c0: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
b2d0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
b2e0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
b2f0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
b300: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
b310: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
b320: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
b330: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
b340: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
b350: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
b360: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
b370: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
b380: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
b390: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
b3a0: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c  t error occured,
b3b0: 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
b3c0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
b3d0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
b3e0: 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
b3f0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
b400: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b410: 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
b420: 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
b430: 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
b440: 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
b450: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b460: 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
b470: 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
b480: 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
b490: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
b4a0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
b4b0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
b4c0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
b4d0: 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
b4e0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
b4f0: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
b500: 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20  R.  );.  if(.   
b510: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
b520: 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51  L ||.    rc2==SQ
b530: 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20  LITE_IOERR ||.  
b540: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f    rc2==SQLITE_CO
b550: 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70  RRUPT.  ){.    p
b560: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
b570: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61   rc;.    if( pPa
b580: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
b590: 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26  R_UNLOCK .     &
b5a0: 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
b5b0: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
b5c0: 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
b5d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
b5e0: 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72  the pager is alr
b5f0: 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63  eady unlocked, c
b600: 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  all pager_unlock
b610: 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20  () now to.      
b620: 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  ** clear the err
b630: 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73  or state and ens
b640: 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
b650: 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20  er-cache is .   
b660: 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79     ** completely
b670: 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f   empty..      */
b680: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  .      pager_unl
b690: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
b6a0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b6b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  rc;.}../*.** Exe
b6c0: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
b6d0: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
b6e0: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
b6f0: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
b700: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
b710: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
b720: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
b730: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
b740: 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
b750: 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
b760: 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
b770: 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
b780: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
b790: 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
b7a0: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
b7b0: 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
b7c0: 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
b7d0: 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
b7e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b7f0: 6c 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  le and clear the
b800: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 49 66   error state. If
b810: 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   this means that
b820: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
b830: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ot-journal left 
b840: 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
b850: 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 63 6f 6e  em, the next con
b860: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62  nection.** to ob
b870: 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
b880: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ck on the pager 
b890: 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68  (which may be th
b8a0: 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20  is one) will.** 
b8b0: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
b8c0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
b8d0: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
b8e0: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
b8f0: 6f 72 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  or state, but an
b900: 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
b910: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
b920: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
b930: 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
b940: 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
b950: 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
b960: 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
b970: 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
b980: 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
b990: 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
b9a0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
b9b0: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
b9c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b9d0: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
b9e0: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
b9f0: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
ba00: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
ba10: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
ba20: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
ba30: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
ba40: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
ba50: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
ba60: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
ba70: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
ba80: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
ba90: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
baa0: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
bab0: 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
bac0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
bad0: 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
bae0: 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
baf0: 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
bb00: 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
bb10: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
bb20: 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
bb30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
bb40: 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
bb50: 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
bb60: 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
bb70: 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
bb80: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
bb90: 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
bba0: 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
bbb0: 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
bbc0: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
bbd0: 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
bbe0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
bbf0: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
bc00: 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
bc10: 53 48 41 52 45 44 20 6f 72 20 50 41 47 45 52 5f  SHARED or PAGER_
bc20: 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65  UNLOCK state whe
bc30: 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
bc40: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  e is called, it 
bc50: 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72 65 74 75  is a no-op (retu
bc60: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a  rns SQLITE_OK)..
bc70: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
bc80: 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
bc90: 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
bca0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
bcb0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
bcc0: 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
bcd0: 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
bce0: 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
bcf0: 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
bd00: 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
bd10: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
bd20: 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
bd30: 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
bd40: 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
bd50: 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
bd60: 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
bd70: 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
bd80: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
bd90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
bda0: 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
bdb0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
bdc0: 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
bdd0: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
bde0: 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
bdf0: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
be00: 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
be10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
be20: 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
be30: 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
be40: 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
be50: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
be60: 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
be70: 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
be80: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
be90: 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
bea0: 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
beb0: 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
bec0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
bed0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
bee0: 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
bef0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
bf00: 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
bf10: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
bf20: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
bf30: 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
bf40: 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
bf50: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
bf60: 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
bf70: 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
bf80: 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
bf90: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
bfa0: 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
bfb0: 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
bfc0: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
bfd0: 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
bfe0: 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
bff0: 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
c000: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
c010: 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
c020: 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
c030: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
c040: 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
c050: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
c060: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
c070: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
c080: 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
c090: 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
c0a0: 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
c0b0: 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
c0c0: 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
c0d0: 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
c0e0: 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
c0f0: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
c100: 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
c110: 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
c120: 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
c130: 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
c140: 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
c150: 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
c160: 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
c170: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
c180: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
c190: 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
c1a0: 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e 69 6e 67  ized, if running
c1b0: 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
c1c0: 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 70  e mode, the.** p
c1d0: 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41  ager moves to PA
c1e0: 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
c1f0: 20 28 61 6e 64 20 64 6f 77 6e 67 72 61 64 65 73   (and downgrades
c200: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
c210: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
c220: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 29 2e 0a  e accordingly)..
c230: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
c240: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
c250: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
c260: 61 6e 64 20 69 73 20 69 6e 20 50 41 47 45 52 5f  and is in PAGER_
c270: 53 59 4e 43 45 44 20 73 74 61 74 65 2c 0a 2a 2a  SYNCED state,.**
c280: 20 69 74 20 6d 6f 76 65 73 20 74 6f 20 50 41 47   it moves to PAG
c290: 45 52 5f 45 58 43 4c 55 53 49 56 45 2e 20 4e 6f  ER_EXCLUSIVE. No
c2a0: 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f 77 6e 67   locks are downg
c2b0: 72 61 64 65 64 20 77 68 65 6e 20 72 75 6e 6e 69  raded when runni
c2c0: 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c 75 73 69  ng in.** exclusi
c2d0: 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53  ve mode..**.** S
c2e0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c2f0: 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
c300: 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
c310: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
c320: 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65  ng.** any of the
c330: 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   IO operations t
c340: 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
c350: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75  ournal file or u
c360: 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  nlock the.** dat
c370: 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49  abase then the I
c380: 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
c390: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
c3a0: 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a  user. If the .**
c3b0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69   operation to fi
c3c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
c3d0: 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74  al file fails, t
c3e0: 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69  hen the code sti
c3f0: 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75  ll.** tries to u
c400: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
c410: 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69  se file if not i
c420: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
c430: 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f  . If the.** unlo
c440: 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  ck operation fai
c450: 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e  ls as well, then
c460: 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
c470: 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a   code related.**
c480: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72   to the first er
c490: 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
c4a0: 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  (the journal fin
c4b0: 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69  alization one) i
c4c0: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
c4d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c4e0: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
c4f0: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
c500: 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29  , int hasMaster)
c510: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c520: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
c530: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
c540: 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
c550: 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
c560: 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
c570: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
c580: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
c590: 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
c5a0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  peration */..  i
c5b0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
c5c0: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
c5d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c5e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
c5f0: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
c600: 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
c610: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
c620: 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
c630: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
c640: 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  l==0 );.  if( is
c650: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
c660: 29 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 4f 44  ) ){..    /* TOD
c670: 4f 3a 20 54 68 65 72 65 27 73 20 61 20 70 72 6f  O: There's a pro
c680: 62 6c 65 6d 20 68 65 72 65 20 69 66 20 61 20 6a  blem here if a j
c690: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 77 61 73 20  ournal-file was 
c6a0: 6f 70 65 6e 65 64 20 69 6e 20 4d 45 4d 4f 52 59  opened in MEMORY
c6b0: 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 61 6e 64  .    ** mode and
c6c0: 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
c6d0: 6c 2d 6d 6f 64 65 20 69 73 20 63 68 61 6e 67 65  l-mode is change
c6e0: 64 20 74 6f 20 54 52 55 4e 43 41 54 45 20 6f 72  d to TRUNCATE or
c6f0: 20 50 45 52 53 49 53 54 0a 20 20 20 20 2a 2a 20   PERSIST.    ** 
c700: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
c710: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 63 6f 64  action. This cod
c720: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  e should be chan
c730: 67 65 64 20 74 6f 20 61 73 73 75 6d 65 0a 20 20  ged to assume.  
c740: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6a 6f    ** that the jo
c750: 75 72 6e 61 6c 20 6d 6f 64 65 20 68 61 73 20 6e  urnal mode has n
c760: 6f 74 20 63 68 61 6e 67 65 64 20 73 69 6e 63 65  ot changed since
c770: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c780: 20 77 61 73 0a 20 20 20 20 2a 2a 20 73 74 61 72   was.    ** star
c790: 74 65 64 2e 20 41 6e 64 20 74 68 65 20 73 71 6c  ted. And the sql
c7a0: 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
c7b0: 4d 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Mode() function 
c7c0: 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a  should be.    **
c7d0: 20 63 68 61 6e 67 65 64 20 74 6f 20 6d 61 6b 65   changed to make
c7e0: 20 73 75 72 65 20 74 68 61 74 20 74 68 69 73 20   sure that this 
c7f0: 69 73 20 74 68 65 20 63 61 73 65 20 74 6f 6f 2e  is the case too.
c800: 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  .    */..    /* 
c810: 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
c820: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
c830: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
c840: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
c850: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
c860: 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
c870: 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c   isMemoryJournal
c880: 20 3d 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a   = sqlite3IsMemJ
c890: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
c8a0: 66 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fd);.      sqlit
c8b0: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
c8c0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
c8d0: 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e  ( !isMemoryJourn
c8e0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  al ){.        rc
c8f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
c900: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
c910: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
c920: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
c930: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
c940: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
c950: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
c960: 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
c970: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c980: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
c990: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
c9a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
c9b0: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
c9c0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c9d0: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
c9e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
c9f0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
ca00: 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  e .     || pPage
ca10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
ca20: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
ca30: 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b  E_PERSIST.    ){
ca40: 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
ca50: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
ca60: 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20  r, hasMaster);. 
ca70: 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
ca80: 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
ca90: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
caa0: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
cab0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
cac0: 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
cad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
cae0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
caf0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
cb00: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
cb10: 4c 45 54 45 20 7c 7c 20 72 63 20 29 3b 0a 20 20  LETE || rc );.  
cb20: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
cb30: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
cb40: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
cb50: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
cb60: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
cb70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
cb80: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
cb90: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
cba0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
cbb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cbc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
cbd0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73  HECK_PAGES.    s
cbe0: 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
cbf0: 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
cc00: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
cc10: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
cc20: 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
cc30: 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
cc40: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
cc50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  );.    sqlite3Bi
cc60: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
cc70: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
cc80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
cc90: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
cca0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
ccb0: 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  0;.  }..  if( !p
ccc0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
ccd0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20  Mode ){.    rc2 
cce0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
ccf0: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
cd00: 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
cd10: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
cd20: 48 41 52 45 44 3b 0a 20 20 20 20 70 50 61 67 65  HARED;.    pPage
cd30: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
cd40: 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ne = 0;.  }else 
cd50: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
cd60: 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
cd70: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
cd80: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
cd90: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50  LUSIVE;.  }.  pP
cda0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
cdb0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
cdc0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
cdd0: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
cde0: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44  d = 0;..  /* TOD
cdf0: 4f 3a 20 49 73 20 74 68 69 73 20 6f 70 74 69 6d  O: Is this optim
ce00: 61 6c 3f 20 57 68 79 20 69 73 20 74 68 65 20 64  al? Why is the d
ce10: 62 20 73 69 7a 65 20 69 6e 76 61 6c 69 64 61 74  b size invalidat
ce20: 65 64 20 68 65 72 65 20 0a 20 20 2a 2a 20 77 68  ed here .  ** wh
ce30: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
ce40: 66 69 6c 65 20 69 73 20 6e 6f 74 20 75 6e 6c 6f  file is not unlo
ce50: 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50 61 67 65  cked? */.  pPage
ce60: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
ce70: 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  0;.  sqlite3Pcac
ce80: 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  heTruncate(pPage
ce90: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67  r->pPCache, pPag
cea0: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69  er->dbSize);.  i
ceb0: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
cec0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
ced0: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  alid = 0;.  }.. 
cee0: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
cef0: 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
cf00: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
cf10: 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f  er aData must po
cf20: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cf30: 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  of pPager->pageS
cf40: 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  ize bytes.** of 
cf50: 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e  data. Compute an
cf60: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
cf70: 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68  sum based ont th
cf80: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
cf90: 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61  e .** page of da
cfa0: 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  ta and the curre
cfb0: 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67  nt value of pPag
cfc0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a  er->cksumInit..*
cfd0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
cfe0: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
cff0: 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a  . It is really j
d000: 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ust the sum of t
d010: 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e  he .** random in
d020: 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61  itial value (pPa
d030: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20  ger->cksumInit) 
d040: 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20  and every 200th 
d050: 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  byte.** of the p
d060: 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69  age data, starti
d070: 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66  ng with byte off
d080: 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67  set (pPager->pag
d090: 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45  eSize%200)..** E
d0a0: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
d0b0: 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d  rpreted as an 8-
d0c0: 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  bit unsigned int
d0d0: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  eger..**.** Chan
d0e0: 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61  ging the formula
d0f0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
d100: 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72   this checksum r
d110: 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20  esults in an.** 
d120: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75  incompatible jou
d130: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
d140: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e  ..**.** If journ
d150: 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  al corruption oc
d160: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
d170: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
d180: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a   most likely .**
d190: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61   scenario is tha
d1a0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
d1b0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
d1c0: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
d1d0: 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20  nged. .** It is 
d1e0: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
d1f0: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
d200: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
d210: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
d220: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
d230: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
d240: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
d250: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
d260: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
d270: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
d280: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
d290: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
d2a0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
d2b0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
d2c0: 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
d2d0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38  pPager, const u8
d2e0: 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
d2f0: 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
d300: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
d310: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76     /* Checksum v
d320: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
d330: 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  /.  int i = pPag
d340: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
d350: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
d360: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
d370: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
d380: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
d390: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
d3a0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
d3b0: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
d3c0: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
d3d0: 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
d3e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d3f0: 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
d400: 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
d410: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
d420: 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
d430: 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
d440: 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
d450: 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
d460: 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
d470: 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
d480: 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
d490: 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
d4a0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
d4b0: 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
d4c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
d4d0: 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a  *.** The isMainJ
d4e0: 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65  rnl flag is true
d4f0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
d500: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
d510: 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c  urnal and.** fal
d520: 73 65 20 66 6f 72 20 74 68 65 20 73 74 61 74 65  se for the state
d530: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ment journal.  T
d540: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
d550: 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a   journal uses.**
d560: 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
d570: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d580: 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a  al does not..**.
d590: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
d5a0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
d5b0: 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
d5c0: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
d5d0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
d5e0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
d5f0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
d600: 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
d610: 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
d620: 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
d630: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
d640: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
d650: 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
d660: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
d670: 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
d680: 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
d690: 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
d6a0: 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
d6b0: 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
d6c0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
d6d0: 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
d6e0: 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
d6f0: 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
d700: 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
d710: 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
d720: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
d730: 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
d740: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
d750: 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
d760: 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
d770: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
d780: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
d790: 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
d7a0: 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
d7b0: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d7c0: 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
d7d0: 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
d7e0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
d7f0: 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
d800: 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
d810: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
d820: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
d830: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
d840: 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
d850: 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
d860: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
d870: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
d880: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
d890: 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
d8a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
d8b0: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
d8c0: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
d8d0: 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
d8e0: 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
d8f0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
d900: 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
d910: 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
d920: 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
d930: 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
d940: 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
d950: 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
d960: 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
d970: 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
d980: 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
d990: 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
d9a0: 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
d9b0: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
d9c0: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
d9d0: 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
d9e0: 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
d9f0: 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
da00: 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
da10: 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
da20: 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
da30: 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
da40: 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
da50: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
da60: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
da70: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
da80: 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
da90: 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
daa0: 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
dab0: 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
dac0: 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
dad0: 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
dae0: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
daf0: 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
db00: 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
db10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
db20: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
db30: 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
db40: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
db50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
db60: 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
db70: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
db80: 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
db90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
dba0: 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
dbb0: 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
dbc0: 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 6e  l. */.  int isUn
dbd0: 73 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  sync,           
dbe0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
dbf0: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 75 6e   reading from un
dc00: 73 79 6e 63 65 64 20 6d 61 69 6e 20 6a 6f 75 72  synced main jour
dc10: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  nal */.  i64 *pO
dc20: 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
dc30: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
dc40: 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
dc50: 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  ayback */.  int 
dc60: 69 73 53 61 76 65 70 6e 74 2c 20 20 20 20 20 20  isSavepnt,      
dc70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
dc80: 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
dc90: 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t rollback */.  
dca0: 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 20 20  Bitvec *pDone   
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcc0: 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
dcd0: 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
dce0: 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
dcf0: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
dd00: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
dd10: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
dd20: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
dd30: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
dd40: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
dd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
dd60: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
dd70: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
dd80: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
ddb0: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
ddc0: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
ddd0: 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ddf0: 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
de00: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
de10: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
de20: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
de30: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
de40: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
de50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
de60: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
de70: 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
de80: 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
de90: 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
dea0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
deb0: 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
dec0: 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
ded0: 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
dee0: 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
def0: 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
df00: 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
df10: 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
df20: 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
df30: 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
df40: 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
df50: 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
df60: 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
df70: 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
df80: 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72  ta = (u8*)pPager
df90: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
dfa0: 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
dfb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
dfc0: 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
dfd0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
dfe0: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20 2f  llocated */..  /
dff0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20  * Read the page 
e000: 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
e010: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f  data from the jo
e020: 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
e030: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20  rnal.  ** file. 
e040: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
e050: 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
e060: 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  er if an IO erro
e070: 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20  r occurs..  */. 
e080: 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e   jfd = isMainJrn
e090: 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  l ? pPager->jfd 
e0a0: 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a  : pPager->sjfd;.
e0b0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
e0c0: 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c  s(jfd, *pOffset,
e0d0: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
e0e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
e0f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
e100: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
e110: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
e120: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
e130: 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
e140: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e150: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
e160: 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
e170: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
e180: 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
e190: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
e1a0: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
e1b0: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
e1c0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
e1d0: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
e1e0: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
e1f0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
e200: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
e210: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
e220: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
e230: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
e240: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
e250: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e260: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
e270: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
e280: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
e290: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
e2a0: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
e2b0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
e2c0: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
e2d0: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
e2e0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
e2f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
e300: 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
e310: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
e320: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
e330: 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
e340: 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
e350: 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
e360: 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
e370: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e380: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
e390: 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
e3a0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
e3b0: 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
e3c0: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
e3d0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
e3e0: 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
e3f0: 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
e400: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
e410: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
e420: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e430: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
e440: 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  ..  if( pDone &&
e450: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
e460: 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
e470: 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
e480: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
e490: 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  c;.  }..  assert
e4a0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
e4b0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
e4c0: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
e4d0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
e4e0: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
e4f0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
e500: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
e510: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
e520: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
e530: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
e540: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
e550: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
e560: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
e570: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
e580: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e590: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
e5a0: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
e5b0: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
e5c0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
e5d0: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
e5e0: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
e5f0: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
e600: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
e610: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
e620: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
e630: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
e640: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
e650: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
e660: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
e670: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
e680: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
e690: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
e6a0: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
e6b0: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
e6c0: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
e6d0: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
e6e0: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
e6f0: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
e700: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
e710: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
e720: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
e730: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
e740: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
e750: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
e760: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
e770: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
e780: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
e790: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
e7a0: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
e7b0: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
e7c0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
e7d0: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
e7e0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e7f0: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
e800: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
e810: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
e820: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
e830: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
e840: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
e850: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
e860: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
e870: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
e880: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
e890: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
e8a0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
e8b0: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
e8c0: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
e8d0: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
e8e0: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
e8f0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
e900: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
e910: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
e920: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
e930: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
e940: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
e950: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
e960: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
e970: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
e980: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
e990: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
e9a0: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
e9b0: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
e9c0: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
e9d0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
e9e0: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
e9f0: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
ea00: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
ea10: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
ea20: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
ea30: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
ea40: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
ea50: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
ea60: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
ea70: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
ea80: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
ea90: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
eaa0: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
eab0: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
eac0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
ead0: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
eae0: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
eaf0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
eb00: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
eb10: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
eb20: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
eb30: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
eb40: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
eb50: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
eb60: 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
eb70: 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
eb80: 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
eb90: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
eba0: 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
ebb0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
ebc0: 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
ebd0: 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
ebe0: 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
ebf0: 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
ec00: 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
ec10: 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
ec20: 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
ec30: 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
ec40: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
ec50: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
ec60: 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
ec70: 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
ec80: 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
ec90: 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
eca0: 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
ecb0: 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
ecc0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
ecd0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61  ger->pageSize, a
ece0: 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20  Data),.         
ecf0: 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e        (isMainJrn
ed00: 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22  l?"main-journal"
ed10: 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a  :"sub-journal").
ed20: 20 20 29 29 3b 0a 20 20 69 66 28 20 28 70 50 61    ));.  if( (pPa
ed30: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
ed40: 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  R_EXCLUSIVE).   
ed50: 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d  && (pPg==0 || 0=
ed60: 3d 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  =(pPg->flags&PGH
ed70: 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20  DR_NEED_SYNC)). 
ed80: 20 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67    && isOpen(pPag
ed90: 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 21 69  er->fd).   && !i
eda0: 73 55 6e 73 79 6e 63 0a 20 20 29 7b 0a 20 20 20  sUnsync.  ){.   
edb0: 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
edc0: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
edd0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
ede0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
edf0: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
ee00: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
ee10: 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a  ageSize, ofst);.
ee20: 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
ee30: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
ee40: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
ee50: 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
ee60: 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  no;.    }.    sq
ee70: 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
ee80: 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
ee90: 70 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 3b  p, pgno, aData);
eea0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
eeb0: 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
eec0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
eed0: 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
eee0: 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
eef0: 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
ef00: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
ef10: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
ef20: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
ef30: 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
ef40: 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
ef50: 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
ef60: 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
ef70: 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
ef80: 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
ef90: 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
efa0: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
efb0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
efc0: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
efd0: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
efe0: 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
eff0: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
f000: 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
f010: 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
f020: 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
f030: 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
f040: 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
f050: 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
f060: 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
f070: 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
f080: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
f090: 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
f0a0: 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
f0b0: 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
f0c0: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
f0d0: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
f0e0: 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
f0f0: 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
f100: 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
f110: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
f120: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
f130: 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
f140: 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
f150: 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
f160: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
f170: 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
f180: 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
f190: 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
f1a0: 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
f1b0: 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
f1c0: 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
f1d0: 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
f1e0: 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
f1f0: 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
f200: 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
f210: 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
f220: 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
f230: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
f240: 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66  avepnt );.    if
f250: 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
f260: 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
f270: 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
f280: 31 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  1))!=SQLITE_OK )
f290: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
f2a0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  c;.    }.    pPg
f2b0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
f2c0: 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20  R_NEED_READ;.   
f2d0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
f2e0: 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
f2f0: 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
f300: 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
f310: 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
f320: 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
f330: 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
f340: 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
f350: 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
f360: 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
f370: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
f380: 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
f390: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
f3a0: 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
f3b0: 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
f3c0: 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
f3d0: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
f3e0: 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
f3f0: 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
f400: 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
f410: 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
f420: 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
f430: 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
f440: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
f450: 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70  a;.    pData = p
f460: 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d  Pg->pData;.    m
f470: 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61  emcpy(pData, aDa
f480: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
f490: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
f4a0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
f4b0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
f4c0: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
f4d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f4e0: 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21  isMainJrnl && (!
f4f0: 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f  isSavepnt || *pO
f500: 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a  ffset<=pPager->j
f510: 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20  ournalHdr) ){.  
f520: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
f530: 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
f540: 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65  age were just re
f550: 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20  stored from the 
f560: 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a  main .      ** j
f570: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
f580: 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75  n its content mu
f590: 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65  st be as they we
f5a0: 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20  re when the .   
f5b0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
f5c0: 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  n was first open
f5d0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
f5e0: 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65   we can mark the
f5f0: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61   page.      ** a
f600: 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74  s clean, since t
f610: 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20  here will be no 
f620: 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74  need to write it
f630: 20 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20   out to the..   
f640: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
f650: 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65  here is one exce
f660: 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75  ption to this ru
f670: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  le. If the page 
f680: 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a  is being rolled.
f690: 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73        ** back as
f6a0: 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70   part of a savep
f6b0: 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65  oint (or stateme
f6c0: 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f  nt) rollback fro
f6d0: 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75  m an .      ** u
f6e0: 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
f6f0: 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
f700: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
f710: 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20  t is not safe.  
f720: 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74      ** to mark t
f730: 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
f740: 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
f750: 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61  e marking the pa
f760: 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63  ge as.      ** c
f770: 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20  lean will clear 
f780: 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
f790: 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20  YNC flag. Since 
f7a0: 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20  the page is.    
f7b0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20    ** already in 
f7c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f7d0: 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61   (recorded in Pa
f7e0: 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20  ger.pInJournal) 
f7f0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
f800: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
f810: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64   flag is cleared
f820: 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
f830: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
f840: 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69    ** again withi
f850: 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
f860: 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d  on, it will be m
f870: 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62  arked as dirty b
f880: 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ut.      ** the 
f890: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
f8a0: 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65  flag will not be
f8b0: 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74   set. It could t
f8c0: 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a  hen potentially.
f8d0: 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74        ** be writ
f8e0: 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65  ten out into the
f8f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
f900: 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61  efore its journa
f910: 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  l file.      ** 
f920: 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65  segment is synce
f930: 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63  d. If a crash oc
f940: 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66  curs during or f
f950: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20  ollowing this,. 
f960: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
f970: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
f980: 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  ensue..      */.
f990: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
f9a0: 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
f9b0: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
f9c0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
f9d0: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
f9e0: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
f9f0: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
fa00: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
fa10: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
fa20: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
fa30: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
fa40: 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
fa50: 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
fa60: 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
fa70: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
fa80: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
fa90: 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
faa0: 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
fab0: 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
fac0: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
fad0: 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
fae0: 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
faf0: 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
fb00: 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
fb10: 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
fb20: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
fb30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
fb40: 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
fb50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
fb60: 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
fb70: 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
fb80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56  fined(SQLITE_COV
fb90: 45 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  ERAGE_TEST)./*.*
fba0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  * This routine l
fbb0: 6f 6f 6b 73 20 61 68 65 61 64 20 69 6e 74 6f 20  ooks ahead into 
fbc0: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
fbd0: 20 66 69 6c 65 20 61 6e 64 20 64 65 74 65 72 6d   file and determ
fbe0: 69 6e 65 73 0a 2a 2a 20 77 68 65 74 68 65 72 20  ines.** whether 
fbf0: 6f 72 20 6e 6f 74 20 74 68 65 20 6e 65 78 74 20  or not the next 
fc00: 72 65 63 6f 72 64 20 28 74 68 65 20 72 65 63 6f  record (the reco
fc10: 72 64 20 74 68 61 74 20 62 65 67 69 6e 73 20 61  rd that begins a
fc20: 74 20 66 69 6c 65 0a 2a 2a 20 6f 66 66 73 65 74  t file.** offset
fc30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fc40: 4f 66 66 29 20 69 73 20 61 20 77 65 6c 6c 2d 66  Off) is a well-f
fc50: 6f 72 6d 65 64 20 70 61 67 65 20 72 65 63 6f 72  ormed page recor
fc60: 64 20 63 6f 6e 73 69 73 74 69 6e 67 0a 2a 2a 20  d consisting.** 
fc70: 6f 66 20 61 20 76 61 6c 69 64 20 70 61 67 65 20  of a valid page 
fc80: 6e 75 6d 62 65 72 2c 20 70 50 61 67 65 2d 3e 70  number, pPage->p
fc90: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
fca0: 20 63 6f 6e 74 65 6e 74 2c 20 66 6f 6c 6c 6f 77   content, follow
fcb0: 65 64 0a 2a 2a 20 62 79 20 61 20 76 61 6c 69 64  ed.** by a valid
fcc0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a   checksum..**.**
fcd0: 20 54 68 65 20 70 61 67 65 72 20 6e 65 76 65 72   The pager never
fce0: 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 74   needs to know t
fcf0: 68 69 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  his in order to 
fd00: 64 6f 20 69 74 73 20 6a 6f 62 2e 20 20 20 54 68  do its job.   Th
fd10: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
fd20: 20 6f 6e 6c 79 20 75 73 65 64 20 66 72 6f 6d 20   only used from 
fd30: 77 69 74 68 20 61 73 73 65 72 74 28 29 20 61 6e  with assert() an
fd40: 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  d testcase() mac
fd50: 72 6f 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ros..*/.static i
fd60: 6e 74 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72  nt pagerNextJour
fd70: 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 50  nalPageIsValid(P
fd80: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
fd90: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
fda0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
fdb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
fdc0: 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 63 6b  page */.  u32 ck
fdd0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  sum;           /
fde0: 2a 20 54 68 65 20 70 61 67 65 20 63 68 65 63 6b  * The page check
fdf0: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  sum */.  int rc;
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe10: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
fe20: 6d 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  m read operation
fe30: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  s */.  sqlite3_f
fe40: 69 6c 65 20 2a 66 64 3b 20 20 20 20 2f 2a 20 54  ile *fd;    /* T
fe50: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
fe60: 6f 72 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65  or from which we
fe70: 20 61 72 65 20 72 65 61 64 69 6e 67 20 2a 2f 0a   are reading */.
fe80: 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20    u8 *aData;    
fe90: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
fea0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
feb0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
fec0: 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 61 64  page number head
fed0: 65 72 20 2a 2f 0a 20 20 66 64 20 3d 20 70 50 61  er */.  fd = pPa
fee0: 67 65 72 2d 3e 6a 66 64 3b 0a 20 20 72 63 20 3d  ger->jfd;.  rc =
fef0: 20 72 65 61 64 33 32 62 69 74 73 28 66 64 2c 20   read32bits(fd, 
ff00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ff10: 66 66 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  ff, &pgno);.  if
ff20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ff30: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66  /*NO_TEST*/.  if
ff70: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
ff80: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
ff90: 28 70 50 61 67 65 72 29 20 29 7b 20 72 65 74 75  (pPager) ){ retu
ffa0: 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
ffb0: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66  /*NO_TEST*/.  if
ffc0: 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61  ( pgno>(Pgno)pPa
ffd0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 20 72  ger->dbSize ){ r
ffe0: 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10000 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f  /*NO_TEST*/..  /
10010 2a 20 52 65 61 64 20 74 68 65 20 63 68 65 63 6b  * Read the check
10020 73 75 6d 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  sum */.  rc = re
10030 61 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61  ad32bits(fd, pPa
10040 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
10050 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10060 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69  +4, &cksum);.  i
10070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10080 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20   /*NO_TEST*/..  
100c0 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
100d0 20 61 6e 64 20 76 65 72 69 66 79 20 74 68 65 20   and verify the 
100e0 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 61 44  checksum */.  aD
100f0 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65  ata = (u8*)pPage
10100 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
10110 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
10120 61 64 28 66 64 2c 20 61 44 61 74 61 2c 20 70 50  ad(fd, aData, pP
10130 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
10140 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10150 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  ff+4);.  if( rc!
10160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65  =SQLITE_OK ){ re
10170 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20  turn 0; }       
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
101a0 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 61 67  TEST*/.  if( pag
101b0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
101c0 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29   aData)!=cksum )
101d0 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20  { return 0; }   
101e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f             /*NO_
101f0 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  TEST*/..  /* Rea
10200 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e  ch this point on
10210 6c 79 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ly if the page i
10220 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74  s valid */.  ret
10230 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
10240 2f 2a 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  /* !defined(NDEB
10250 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
10260 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
10270 45 53 54 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50  EST) */../*.** P
10280 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
10290 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
102a0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
102b0 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
102c0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
102d0 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
102e0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
102f0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
10300 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
10310 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
10320 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
10330 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
10340 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
10350 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
10360 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
10370 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
10380 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
10390 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
103a0 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
103b0 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
103c0 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
103d0 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
103e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
103f0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
10400 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10410 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
10420 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
10430 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
10440 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
10450 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
10460 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
10470 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
10480 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
10490 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
104a0 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
104b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
104c0 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
104d0 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
104e0 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
104f0 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
10500 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
10510 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
10520 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
10530 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
10540 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
10550 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
10560 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
10570 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
10580 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
10590 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
105a0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
105b0 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
105c0 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
105d0 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
105e0 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
105f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
10600 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10610 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
10620 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
10630 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
10640 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
10650 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
10660 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
10670 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
10680 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
10690 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
106a0 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
106b0 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
106c0 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
106d0 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
106e0 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
106f0 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
10700 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
10710 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10720 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
10730 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
10740 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
10750 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
10760 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
10770 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
10780 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
10790 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
107a0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
107b0 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
107c0 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
107d0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
107e0 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
107f0 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
10800 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
10810 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
10820 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10830 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
10840 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
10850 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
10860 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
10870 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
10880 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
10890 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
108a0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
108b0 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
108c0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
108d0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
108e0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
108f0 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
10900 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
10910 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
10920 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
10930 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
10940 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
10950 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
10960 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
10970 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
10980 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
10990 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
109a0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
109b0 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
109c0 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
109d0 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
109e0 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
109f0 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
10a00 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
10a10 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
10a20 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
10a30 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
10a40 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
10a50 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
10a60 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
10a70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10a80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10a90 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
10aa0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
10ab0 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
10ac0 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
10ad0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10ae0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
10af0 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
10b00 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
10b10 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
10b20 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
10b30 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
10b40 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
10b50 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
10b60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
10b70 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
10b80 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
10b90 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
10ba0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
10bb0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
10bc0 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
10bd0 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
10be0 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
10bf0 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
10c00 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
10c10 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10c20 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
10c30 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
10c40 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
10c50 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
10c60 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
10c70 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
10c80 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
10c90 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
10ca0 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
10cb0 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
10cc0 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
10cd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
10ce0 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
10cf0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
10d00 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
10d10 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
10d20 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
10d30 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d  URNAL);.    rc =
10d40 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
10d50 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d  Vfs, zMaster, pM
10d60 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29  aster, flags, 0)
10d70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
10d80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
10d90 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
10da0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
10db0 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
10dc0 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
10dd0 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
10de0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
10df0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
10e00 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
10e10 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
10e20 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
10e30 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
10e40 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  tr = 0;.    int 
10e50 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
10e60 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
10e70 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
10e80 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
10e90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
10ea0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
10eb0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
10ec0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
10ed0 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
10ee0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
10ef0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
10f00 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
10f10 61 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ar *)sqlite3Mall
10f20 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  oc((int)nMasterJ
10f30 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
10f40 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  Ptr);.    if( !z
10f50 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
10f60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10f70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
10f80 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
10f90 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d  ut;.    }.    zM
10fa0 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
10fb0 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
10fc0 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20  erJournal];.    
10fd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
10fe0 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
10ff0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
11000 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
11010 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
11020 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
11030 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11040 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  ..    zJournal =
11050 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
11060 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  .    while( (zJo
11070 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
11080 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
11090 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e  rnal ){.      in
110a0 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20 20  t exists;.      
110b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
110c0 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72  cess(pVfs, zJour
110d0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
110e0 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
110f0 74 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ts);.      if( r
11100 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11110 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
11120 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
11130 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 78    }.      if( ex
11140 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ists ){.        
11150 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
11160 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
11170 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
11180 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
11190 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20          ** Open 
111a0 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
111b0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
111c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
111d0 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   If.        ** s
111e0 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
111f0 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
11200 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11210 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
11220 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20         int c;.  
11230 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
11240 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
11250 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
11260 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
11270 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
11280 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
11290 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
112a0 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
112b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
112c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
112d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
112e0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
112f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
11300 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
11310 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
11320 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
11330 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
11340 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11350 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(pJournal);.   
11360 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11380 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
11390 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
113a0 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  }..        c = z
113b0 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
113c0 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
113d0 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
113e0 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  0;.        if( c
113f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
11400 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
11410 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
11420 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11430 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
11440 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
11450 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
11460 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11470 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
11480 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11490 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20  Journal)+1);.   
114a0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d   }.  }.  .  rc =
114b0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
114c0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
114d0 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f  0);..delmaster_o
114e0 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74 65  ut:.  if( zMaste
114f0 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
11500 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
11510 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
11520 7d 20 20 0a 20 20 69 66 28 20 70 4d 61 73 74 65  }  .  if( pMaste
11530 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
11540 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
11550 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  ;.    assert( !i
11560 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20  sOpen(pJournal) 
11570 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11580 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
11590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
115a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
115b0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
115c0 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61  change the actua
115d0 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
115e0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
115f0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
11600 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  em. This only ha
11610 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69  ppens when commi
11620 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
11630 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69  ion,.** or rolli
11640 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ng back a transa
11650 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67  ction (including
11660 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
11670 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a  hot-journal)..**
11680 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
11690 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
116a0 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e   not open, or an
116b0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
116c0 69 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20  is not.** held, 
116d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
116e0 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
116f0 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f 66  ise, the size of
11700 20 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20   the file is.** 
11710 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
11720 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
11730 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
11740 79 74 65 73 29 2e 20 49 66 20 74 68 65 20 66 69  ytes). If the fi
11750 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73  le.** on disk is
11760 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65   currently large
11770 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67  r than nPage pag
11780 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65  es, then use the
11790 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74   VFS.** xTruncat
117a0 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72  e() method to tr
117b0 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  uncate it..**.**
117c0 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69   Or, it might mi
117d0 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
117e0 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e  that the file on
117f0 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72   disk is smaller
11800 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20   than .** nPage 
11810 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72  pages. Some oper
11820 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
11830 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
11840 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
11850 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20   .** you try to 
11860 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
11870 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
11880 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
11890 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   it .** currentl
118a0 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20  y is, so detect 
118b0 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72  this case and wr
118c0 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72  ite a single zer
118d0 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68  o byte to .** th
118e0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
118f0 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a   file instead..*
11900 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
11910 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ul, return SQLIT
11920 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65  E_OK. If an IO e
11930 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
11940 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74  e modifying.** t
11950 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11960 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
11970 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
11980 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
11990 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
119a0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
119b0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
119c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
119d0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
119e0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
119f0 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 69 73  _EXCLUSIVE && is
11a00 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
11a10 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
11a20 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
11a30 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  ;.    /* TODO: I
11a40 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65  s it safe to use
11a50 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
11a60 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72  e here? */.    r
11a70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
11a80 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
11a90 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b  , &currentSize);
11aa0 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70  .    newSize = p
11ab0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
11ac0 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20  (i64)nPage;.    
11ad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11ae0 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65  K && currentSize
11af0 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  !=newSize ){.   
11b00 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69     if( currentSi
11b10 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  ze>newSize ){.  
11b20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11b30 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
11b40 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65  ger->fd, newSize
11b50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11b60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11b70 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
11b80 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e  er->fd, "", 1, n
11b90 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20  ewSize-1);.     
11ba0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
11bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11bc0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
11bd0 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
11be0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11bf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11c10 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
11c20 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
11c30 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
11c40 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
11c50 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
11c60 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
11c70 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
11c80 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
11c90 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
11ca0 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
11cb0 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
11cc0 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74   used .** to det
11cd0 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20  ermine the size 
11ce0 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  and alignment of
11cf0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
11d00 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  and .** master j
11d10 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20  ournal pointers 
11d20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a  within created j
11d30 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
11d40 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
11d50 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65  y files the effe
11d60 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
11d70 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20  e is always 512 
11d80 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bytes..**.** Oth
11d90 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d  erwise, for non-
11da0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
11db0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
11dc0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a  ector size is.**
11dd0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
11de0 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
11df0 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20  orSize() method 
11e00 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 35 31  rounded up to 51
11e10 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65  2 if.** it is le
11e20 73 73 20 74 68 61 6e 20 35 31 32 2c 20 6f 72 20  ss than 512, or 
11e30 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20  rounded down to 
11e40 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
11e50 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65 61  if it.** is grea
11e60 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45 43  ter than MAX_SEC
11e70 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61  TOR_SIZE..*/.sta
11e80 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
11e90 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
11ea0 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
11eb0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
11ec0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
11ed0 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66  empFile );..  if
11ee0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
11ef0 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  ile ){.    /* Se
11f00 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
11f10 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
11f20 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
11f30 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
11f40 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
11f50 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
11f60 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
11f70 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
11f80 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
11f90 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20  ill segfault..  
11fa0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
11fb0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
11fc0 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
11fd0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
11fe0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
11ff0 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20  >sectorSize<512 
12000 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
12010 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
12020 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
12030 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41  r->sectorSize>MA
12040 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b  X_SECTOR_SIZE ){
12050 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58  .    assert( MAX
12060 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31  _SECTOR_SIZE>=51
12070 32 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  2 );.    pPager-
12080 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41  >sectorSize = MA
12090 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  X_SECTOR_SIZE;. 
120a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
120b0 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
120c0 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
120d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
120e0 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
120f0 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
12100 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
12110 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
12120 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
12130 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
12140 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
12150 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
12160 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
12170 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
12180 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
12190 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
121a0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
121b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
121c0 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
121d0 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
121e0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
121f0 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
12200 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
12210 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
12220 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
12230 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
12240 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
12250 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
12260 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
12270 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
12280 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
12290 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
122a0 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
122b0 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
122c0 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
122d0 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
122e0 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
122f0 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
12300 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
12310 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
12320 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
12330 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
12340 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
12350 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
12360 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
12370 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
12380 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
12390 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
123a0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
123b0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
123c0 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37  age case..**  (7
123d0 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
123e0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
123f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
12400 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
12410 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61  rnal.**       na
12420 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d  me.  The value m
12430 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69  ay be zero (indi
12440 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20  cate that there 
12450 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  is no master.** 
12460 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a        journal.).
12470 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65 73  **  (8)  N bytes
12480 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
12490 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68  ournal name.  Th
124a0 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e  e name will be n
124b0 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  ul-terminated.**
124c0 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74         and might
124d0 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e   be shorter than
124e0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
124f0 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68  from (5).  If th
12500 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20  e first byte.** 
12510 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d        of the nam
12520 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74  e is \000 then t
12530 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
12540 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  r journal.  The 
12550 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
12560 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20  journal name is 
12570 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e  stored in UTF-8.
12580 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f  .**  (9)  Zero o
12590 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
125a0 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
125b0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
125c0 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
125d0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
125e0 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
125f0 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
12600 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
12610 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
12620 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
12630 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
12640 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
12650 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
12660 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   8 items above..
12670 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
12680 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12690 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
126a0 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 9th item..**.
126b0 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
126c0 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
126d0 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
126e0 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
126f0 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
12700 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
12710 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
12720 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
12730 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
12740 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
12750 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
12760 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12770 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
12780 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
12790 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
127a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
127b0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
127c0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
127d0 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
127e0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
127f0 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
12800 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
12810 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
12820 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
12830 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
12840 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
12850 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
12860 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
12870 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
12880 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
12890 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
128a0 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
128b0 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
128c0 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
128d0 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
128e0 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
128f0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
12900 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
12910 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
12920 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
12930 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
12940 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
12950 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
12960 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
12970 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
12980 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
12990 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
129a0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
129b0 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
129c0 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
129d0 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
129e0 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
129f0 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
12a00 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
12a10 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
12a20 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
12a30 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
12a40 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
12a50 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
12a60 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12a70 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
12a80 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
12a90 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
12aa0 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
12ab0 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
12ac0 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
12ad0 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
12ae0 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
12af0 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
12b00 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
12b10 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
12b20 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
12b30 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
12b40 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
12b50 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
12b60 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
12b70 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
12b80 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
12b90 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
12ba0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
12bb0 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
12bc0 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
12bd0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
12be0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
12bf0 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
12c00 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
12c10 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
12c20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
12c30 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
12c40 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
12c50 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
12c60 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
12c70 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
12c80 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
12c90 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
12ca0 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
12cb0 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
12cc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
12cd0 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
12ce0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
12cf0 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
12d00 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
12d10 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
12d20 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
12d30 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
12d40 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
12d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12d60 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
12d70 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
12d80 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
12d90 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
12da0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
12db0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
12dc0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
12dd0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
12de0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
12df0 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
12e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12e10 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
12e20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
12e30 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12e50 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
12e60 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
12e70 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
12e80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
12e90 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
12ea0 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
12eb0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12ec0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
12ed0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
12ee0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
12ef0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
12f00 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
12f10 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
12f20 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
12f30 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
12f40 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
12f50 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
12f60 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
12f70 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
12f80 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
12f90 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
12fa0 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
12fb0 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
12fc0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
12fd0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
12fe0 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
12ff0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
13000 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
13010 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
13020 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
13030 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
13040 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
13050 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
13060 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
13070 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
13080 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
13090 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
130a0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
130b0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
130c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
130d0 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
130e0 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
130f0 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
13100 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
13110 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
13120 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
13130 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
13140 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
13150 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
13160 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
13170 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
13180 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
13190 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a  layed back..  **
131a0 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68  .  ** TODO: Tech
131b0 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c  nically the foll
131c0 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f  owing is an erro
131d0 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73  r because it ass
131e0 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62  umes that.  ** b
131f0 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70  uffer Pager.pTmp
13200 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68  Space is (mxPath
13210 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72  name+1) bytes or
13220 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68   larger. i.e. th
13230 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d  at.  ** (pPager-
13240 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61  >pageSize >= pPa
13250 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
13260 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20  hname+1). Using 
13270 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20  os_unix.c,.  ** 
13280 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35   mxPathname is 5
13290 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  12, which is the
132a0 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e   same as the min
132b0 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76  imum allowable v
132c0 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61  alue.  ** for pa
132d0 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a  geSize..  */.  z
132e0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
132f0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
13300 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
13310 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
13320 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
13330 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
13340 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63  ame+1);.  if( rc
13350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
13360 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20  Master[0] ){.   
13370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
13380 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
13390 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
133a0 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
133b0 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20  ;.  }.  zMaster 
133c0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
133d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73  QLITE_OK || !res
133e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
133f0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
13400 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13410 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50  Off = 0;.  needP
13420 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f  agerReset = isHo
13430 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  t;..  /* This lo
13440 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
13450 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61 64  ther when a read
13460 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20  JournalHdr() or 
13470 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79  .  ** pager_play
13480 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
13490 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c  call returns SQL
134a0 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
134b0 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63  O error .  ** oc
134c0 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68  curs. .  */.  wh
134d0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 6e  ile( 1 ){.    in
134e0 74 20 69 73 55 6e 73 79 6e 63 20 3d 20 30 3b 0a  t isUnsync = 0;.
134f0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
13500 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
13510 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
13520 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
13530 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
13540 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
13550 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
13560 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
13570 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
13580 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
13590 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
135a0 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
135b0 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
135c0 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
135d0 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
135e0 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
135f0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
13600 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
13610 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
13620 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
13630 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
13640 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
13650 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
13660 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13670 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
13680 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
13690 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
136a0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
136b0 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
136c0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
136d0 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
136e0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
136f0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
13700 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
13710 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
13720 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
13730 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
13740 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
13750 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
13760 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
13770 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
13780 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
13790 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
137a0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
137b0 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
137c0 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
137d0 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
137e0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
137f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13800 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
13810 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
13820 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
13830 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
13840 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
13850 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
13860 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
13870 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13880 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
13890 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
138a0 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
138b0 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
138c0 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
138d0 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
138e0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
138f0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
13900 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
13910 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
13920 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
13930 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
13940 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
13950 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
13960 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
13970 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
13980 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
13990 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
139a0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
139b0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
139c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
139d0 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
139e0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
139f0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
13a00 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
13a10 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
13a20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
13a30 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
13a40 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
13a50 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
13a60 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
13a70 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
13a80 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
13a90 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
13aa0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
13ab0 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
13ac0 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
13ad0 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
13ae0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
13af0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
13b00 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
13b10 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
13b20 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
13b30 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
13b40 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
13b50 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
13b60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
13b70 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
13b80 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
13b90 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
13ba0 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
13bb0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
13bc0 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
13bd0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
13be0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
13bf0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
13c00 50 61 67 65 72 29 21 3d 70 50 61 67 65 72 2d 3e  Pager)!=pPager->
13c10 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20  journalOff.     
13c20 20 20 20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70      && ((szJ - p
13c30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13c40 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
13c50 53 5a 28 70 50 61 67 65 72 29 29 3e 30 0a 20 20  SZ(pPager))>0.  
13c60 20 20 20 20 20 20 20 26 26 20 70 61 67 65 72 4e         && pagerN
13c70 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73  extJournalPageIs
13c80 56 61 6c 69 64 28 70 50 61 67 65 72 29 0a 20 20  Valid(pPager).  
13c90 20 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65    );.    if( nRe
13ca0 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
13cb0 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
13cc0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
13cd0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
13ce0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
13cf0 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
13d00 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
13d10 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
13d20 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
13d30 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
13d40 29 3b 0a 20 20 20 20 20 20 69 73 55 6e 73 79 6e  );.      isUnsyn
13d50 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  c = 1;.    }..  
13d60 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
13d70 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
13d80 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
13d90 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
13da0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
13db0 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
13dc0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
13dd0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
13de0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13df0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
13e00 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
13e10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
13e20 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
13e30 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
13e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13e50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
13e60 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
13e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13e80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
13e90 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
13ea0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
13eb0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
13ec0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
13ed0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
13ee0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
13ef0 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
13f00 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
13f10 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
13f20 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
13f30 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
13f40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
13f50 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
13f60 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
13f70 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
13f80 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
13f90 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
13fa0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 31  ne_page(pPager,1
13fb0 2c 69 73 55 6e 73 79 6e 63 2c 26 70 50 61 67 65  ,isUnsync,&pPage
13fc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
13fd0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
13fe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13ff0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
14000 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
14010 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14020 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
14030 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14040 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
14050 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14060 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14070 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
14080 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
14090 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  lback, then the 
140a0 64 61 74 61 62 61 73 65 20 69 73 20 70 72 6f 62  database is prob
140b0 61 62 6c 79 0a 20 20 20 20 20 20 20 20 20 20 2a  ably.          *
140c0 2a 20 67 6f 69 6e 67 20 74 6f 20 65 6e 64 20 75  * going to end u
140d0 70 20 62 65 69 6e 67 20 63 6f 72 72 75 70 74 2e  p being corrupt.
140e0 20 20 49 74 20 69 73 20 63 6f 72 72 75 70 74 20    It is corrupt 
140f0 74 6f 20 75 73 2c 20 61 6e 79 68 6f 77 2e 0a 20  to us, anyhow.. 
14100 20 20 20 20 20 20 20 20 20 2a 2a 20 50 65 72 68           ** Perh
14110 61 70 73 20 74 68 65 20 6e 65 78 74 20 70 72 6f  aps the next pro
14120 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
14130 6e 67 20 63 61 6e 20 66 69 78 20 69 74 2e 2e 2e  ng can fix it...
14140 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
14150 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
14160 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
14170 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
14180 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
14190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
141a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
141b0 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
141c0 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
141d0 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20  _playback:.  /* 
141e0 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c  Following a roll
141f0 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
14200 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
14210 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72  e back in its or
14220 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74  iginal.  ** stat
14230 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  e prior to the s
14240 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
14250 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f  saction, so invo
14260 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ke the.  ** SQLI
14270 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
14280 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  ANGED file-contr
14290 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73  ol method to dis
142a0 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73  able the.  ** as
142b0 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65  sertion that the
142c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
142d0 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65  nter was modifie
142e0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
142f0 28 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 64  (.    pPager->fd
14300 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c  ->pMethods==0 ||
14310 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
14320 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
14330 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54  ->fd,SQLITE_FCNT
14340 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30  L_DB_UNCHANGED,0
14350 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29  )>=SQLITE_OK.  )
14360 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
14370 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
14380 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
14390 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
143a0 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
143b0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
143c0 68 61 74 20 6f 63 63 75 72 65 64 20 61 66 74 65  hat occured afte
143d0 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  r the change-cou
143e0 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
143f0 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72   but .  ** befor
14400 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
14410 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  n was committed,
14420 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
14430 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d  -counter .  ** m
14440 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20  odification may 
14450 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  just have been r
14460 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73  everted. If this
14470 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c   happens in excl
14480 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65  usive .  ** mode
14490 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
144a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70  t transactions p
144b0 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  erformed by the 
144c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
144d0 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20  not.  ** update 
144e0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
144f0 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20  er at all. This 
14500 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68  may lead to cach
14510 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a  e inconsistency.
14520 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f    ** problems fo
14530 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  r other processe
14540 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
14550 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53  in the future. S
14560 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20  o, just.  ** in 
14570 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
14580 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68  ppened, clear th
14590 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
145a0 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f  e flag now..  */
145b0 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
145c0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
145d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
145e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
145f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
14600 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
14610 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
14620 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
14630 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
14640 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
14650 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
14660 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+1);.    testca
14670 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
14680 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
14690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
146a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
146b0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
146c0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
146d0 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65  ]!='\0');.    te
146e0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
146f0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
14700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14710 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
14720 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
14730 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
14740 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
14750 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
14760 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
14770 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
14780 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
14790 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
147a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
147b0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
147c0 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
147d0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
147e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
147f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
14800 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
14810 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
14820 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
14830 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
14840 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
14850 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
14860 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
14870 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
14880 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
14890 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
148a0 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
148b0 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
148c0 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
148d0 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
148e0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
148f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14900 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
14910 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
14920 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
14930 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
14940 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
14950 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
14960 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
14970 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
14980 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
14990 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
149a0 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
149b0 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
149c0 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
149d0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
149e0 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
149f0 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
14a00 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
14a10 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
14a20 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
14a30 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
14a40 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
14a50 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
14a60 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
14a70 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
14a80 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
14a90 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
14aa0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
14ab0 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
14ac0 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
14ad0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
14ae0 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
14af0 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
14b00 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
14b10 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
14b20 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
14b30 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
14b40 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
14b50 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
14b60 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
14b70 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
14b80 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
14b90 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
14ba0 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
14bb0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
14bc0 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
14bd0 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
14be0 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
14bf0 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
14c00 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
14c10 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
14c20 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
14c30 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
14c40 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
14c50 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
14c60 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
14c70 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
14c80 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
14c90 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
14ca0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
14cb0 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
14cc0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
14cd0 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
14ce0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
14cf0 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
14d00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14d10 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
14d20 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
14d30 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
14d40 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
14d50 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
14d60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
14d70 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
14d80 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
14d90 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
14da0 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
14db0 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
14dc0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
14dd0 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
14de0 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
14df0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
14e00 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
14e10 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
14e20 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
14e30 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
14e40 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
14e50 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
14e60 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
14e70 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
14e80 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
14e90 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
14ea0 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
14eb0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
14ec0 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
14ed0 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
14ee0 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
14ef0 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
14f00 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
14f10 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
14f20 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
14f30 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
14f40 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
14f50 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
14f60 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
14f70 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
14f80 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
14f90 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
14fa0 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
14fb0 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
14fc0 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
14fd0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
14fe0 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
14ff0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
15000 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
15010 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
15020 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
15030 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
15040 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
15050 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
15060 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15080 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
15090 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
150a0 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
150b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
150c0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
150d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
150e0 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
150f0 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
15100 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
15110 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
15120 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
15130 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
15140 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
15150 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
15160 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
15170 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
15180 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
15190 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
151a0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
151b0 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
151c0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
151d0 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
151e0 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
151f0 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
15200 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15210 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15220 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61  * Set the databa
15230 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20  se size back to 
15240 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73  the value it was
15250 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65   before the save
15260 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e  point .  ** bein
15270 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f  g reverted was o
15280 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
15290 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
152a0 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76  Savepoint ? pSav
152b0 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20  epoint->nOrig : 
152c0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
152d0 7a 65 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50  ze;..  /* Use pP
152e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
152f0 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
15300 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
15310 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
15320 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
15330 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
15340 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
15350 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
15360 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
15370 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
15380 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
15390 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
153a0 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
153b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
153c0 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
153d0 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
153e0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
153f0 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 42 65 67  alOff;..  /* Beg
15400 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61  in by rolling ba
15410 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ck records from 
15420 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15430 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
15440 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
15450 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
15460 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e  tinuing to the n
15470 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
15480 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d  er..  ** There m
15490 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20  ight be records 
154a0 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
154b0 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20  nal that have a 
154c0 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
154d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
154e0 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  e current databa
154f0 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d  se size (pPager-
15500 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f  >dbSize) but tho
15510 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  se.  ** will be 
15520 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69  skipped automati
15530 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72  cally.  Pages ar
15540 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65  e added to pDone
15550 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72   as they.  ** ar
15560 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  e played back.. 
15570 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
15580 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 48 64 72  oint ){.    iHdr
15590 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
155a0 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70  ->iHdrOffset ? p
155b0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
155c0 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20  ffset : szJ;.   
155d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
155e0 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  Off = pSavepoint
155f0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77  ->iOffset;.    w
15600 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
15610 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  _OK && pPager->j
15620 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66  ournalOff<iHdrOf
15630 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
15640 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
15650 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
15660 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a  1, 0, &pPager->j
15670 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44  ournalOff, 1, pD
15680 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  one);.    }.    
15690 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
156a0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
156b0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
156c0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
156d0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
156e0 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
156f0 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
15700 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15710 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
15720 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
15730 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
15740 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
15750 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
15760 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
15770 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
15780 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
15790 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
157a0 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
157b0 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
157c0 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
157d0 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
157e0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
157f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
15800 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15810 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
15820 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
15830 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
15840 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
15850 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
15860 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
15870 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
15880 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
15890 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
158a0 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a  pPager, szJ, &nJ
158b0 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
158c0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
158d0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20  LITE_DONE );..  
158e0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
158f0 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  "pPager->journal
15900 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
15910 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
15920 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a  er->journalOff".
15930 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72      ** test is r
15940 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74  elated to ticket
15950 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65   #2565.  See the
15960 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74   discussion in t
15970 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  he.    ** pager_
15980 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74  playback() funct
15990 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ion for addition
159a0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
159b0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
159c0 74 28 20 21 28 6e 4a 52 65 63 3d 3d 30 0a 20 20  t( !(nJRec==0.  
159d0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
159e0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
159f0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
15a00 65 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)!=pPager->jou
15a10 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20 20 20  rnalOff.        
15a20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70 50 61 67   && ((szJ - pPag
15a30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
15a40 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
15a50 70 50 61 67 65 72 29 29 3e 30 0a 20 20 20 20 20  pPager))>0.     
15a60 20 20 20 20 26 26 20 70 61 67 65 72 4e 65 78 74      && pagerNext
15a70 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61 6c  JournalPageIsVal
15a80 69 64 28 70 50 61 67 65 72 29 29 0a 20 20 20 20  id(pPager)).    
15a90 29 3b 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63  );.    if( nJRec
15aa0 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61  ==0 .     && pPa
15ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
15ac0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
15ad0 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
15ae0 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29  journalOff.    )
15af0 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
15b00 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61  (u32)((szJ - pPa
15b10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
15b20 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
15b30 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
15b40 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
15b50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
15b60 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72  <nJRec && pPager
15b70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
15b80 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ; ii++){.      r
15b90 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
15ba0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
15bb0 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65  er, 1, 0, &pPage
15bc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
15bd0 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a  , pDone);.    }.
15be0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
15bf0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
15c00 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
15c10 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
15c20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15c30 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  ==szJ );..  /* F
15c40 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
15c50 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
15c60 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
15c70 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
15c80 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
15c90 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
15ca0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
15cb0 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
15cc0 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
15cd0 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
15ce0 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
15cf0 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
15d00 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
15d10 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
15d20 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
15d30 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15d40 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
15d50 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65  4 offset = pSave
15d60 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28  point->iSubRec*(
15d70 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
15d80 7a 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  ze);.    for(ii=
15d90 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
15da0 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  Rec; rc==SQLITE_
15db0 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d  OK && ii<pPager-
15dc0 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b  >nSubRec; ii++){
15dd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
15de0 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61  ffset==ii*(4+pPa
15df0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
15e00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
15e10 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
15e20 70 61 67 65 28 70 50 61 67 65 72 2c 20 30 2c 20  page(pPager, 0, 
15e30 30 2c 20 26 6f 66 66 73 65 74 2c 20 31 2c 20 70  0, &offset, 1, p
15e40 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Done);.    }.   
15e50 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
15e60 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
15e70 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
15e80 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a  Destroy(pDone);.
15e90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
15eb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
15ec0 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  szJ;.  }.  retur
15ed0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
15ee0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
15ef0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
15f00 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
15f10 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
15f20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15f30 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
15f40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
15f50 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
15f60 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
15f70 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
15f80 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
15f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
15fa0 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
15fb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
15fc0 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
15fd0 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
15fe0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
15ff0 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
16000 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
16010 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
16020 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
16030 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
16040 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
16050 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
16060 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
16070 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
16080 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
16090 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
160a0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
160b0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
160c0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
160d0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
160e0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
160f0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
16100 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
16110 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
16120 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
16130 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
16140 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
16150 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
16170 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
16180 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
16190 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
161a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
161b0 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
161c0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
161d0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
161e0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
161f0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
16200 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
16210 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
16220 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
16240 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
16250 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
16260 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
16270 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
16280 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
16290 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
162a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
162b0 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
162c0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
162d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
162e0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
162f0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
16300 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
16310 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
16320 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
16330 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
16340 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
16350 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
16360 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
16370 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
16380 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
16390 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
163a0 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
163b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
163c0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
163d0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
163e0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
163f0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
16400 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
16410 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
16420 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16430 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
16440 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
16450 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
16460 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
16470 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
16480 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
16490 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
164a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
164b0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
164c0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
164d0 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67  tSafetyLevel(Pag
164e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
164f0 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c  level, int bFull
16500 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  Fsync){.  pPager
16510 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76  ->noSync =  (lev
16520 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
16530 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b  >tempFile) ?1:0;
16540 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
16550 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20  ync = (level==3 
16560 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
16570 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
16580 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
16590 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53   = (bFullFsync?S
165a0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a  QLITE_SYNC_FULL:
165b0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
165c0 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  AL);.  if( pPage
165d0 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
165e0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
165f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16600 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
16610 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
16620 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
16630 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
16640 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
16650 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
16660 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
16670 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
16680 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
16690 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
166a0 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
166b0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
166c0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
166d0 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
166e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
166f0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
16700 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
16710 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
16720 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
16730 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
16740 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
16750 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
16760 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
16770 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
16780 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
16790 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
167a0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
167b0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
167c0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
167d0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
167e0 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
167f0 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
16800 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
16810 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
16820 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
16830 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
16840 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16850 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
16860 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
16870 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
16880 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
16890 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
168a0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
168b0 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
168c0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
168d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
168e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
168f0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
16900 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
16910 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
16920 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
16930 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
16940 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
16950 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
16960 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
16970 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
16980 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
16990 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
169a0 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
169b0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
169c0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
169d0 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
169e0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
169f0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
16a00 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
16a10 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
16a20 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
16a30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16a40 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
16a50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
16a60 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
16a70 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
16a80 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
16a90 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
16aa0 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
16ab0 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
16ac0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
16ad0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
16ae0 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
16af0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16b00 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
16b10 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
16b20 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
16b30 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
16b40 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
16b50 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
16b60 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
16b70 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
16b80 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
16b90 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
16ba0 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
16bb0 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
16bc0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
16bd0 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
16be0 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
16bf0 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
16c00 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
16c10 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
16c20 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
16c30 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
16c40 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
16c50 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
16c60 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
16c70 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
16c80 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
16c90 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
16ca0 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
16cb0 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
16ce0 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
16cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d20 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
16d30 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
16d40 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
16d50 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
16d60 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
16d70 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
16d80 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
16d90 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
16da0 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
16db0 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
16dc0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
16dd0 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
16de0 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
16df0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
16e00 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
16e10 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
16e20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
16e30 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
16e40 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
16e50 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
16e60 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
16e70 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
16e80 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
16e90 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
16ea0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
16eb0 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
16ec0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
16ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
16ee0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
16ef0 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
16f00 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
16f10 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16f20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
16f30 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
16f40 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
16f50 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
16f60 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
16f70 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
16f80 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20  andler */.){  . 
16f90 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
16fa0 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
16fb0 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
16fc0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
16fd0 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
16fe0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  g;.}../*.** Set 
16ff0 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
17000 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
17010 2e 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  . If not NULL, t
17020 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
17030 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68  .** is called wh
17040 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
17050 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68  f a page in cach
17060 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 28 72  e is modified (r
17070 65 73 74 6f 72 65 64 29 0a 2a 2a 20 61 73 20 70  estored).** as p
17080 61 72 74 20 6f 66 20 61 20 74 72 61 6e 73 61 63  art of a transac
17090 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e  tion or savepoin
170a0 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 54 68 65 20  t rollback. The 
170b0 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 0a  callback gives .
170c0 2a 2a 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20  ** higher-level 
170d0 63 6f 64 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e  code an opportun
170e0 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
170f0 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
17100 20 74 6f 20 0a 2a 2a 20 61 67 72 65 65 20 77 69   to .** agree wi
17110 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
17120 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f  page data..*/.vo
17130 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
17140 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72  etReiniter(Pager
17150 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
17160 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
17170 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  *)){.  pPager->x
17180 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
17190 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  it;.}../*.** Cha
171a0 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
171b0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
171c0 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
171d0 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
171e0 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
171f0 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
17200 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
17210 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
17220 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
17230 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17240 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
17250 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
17260 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
17270 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
17280 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
17290 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
172a0 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
172b0 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
172c0 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
172d0 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
172e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
172f0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
17300 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
17310 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
17320 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
17330 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
17340 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
17350 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
17360 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
17370 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
17380 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
17390 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
173a0 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
173b0 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
173c0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
173d0 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
173e0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
173f0 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
17400 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
17410 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
17420 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
17430 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
17440 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
17450 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
17460 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
17470 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
17480 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
17490 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
174a0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
174b0 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
174c0 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
174d0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
174e0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
174f0 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
17500 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
17510 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
17520 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
17530 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
17540 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
17550 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
17560 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
17570 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
17580 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
17590 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
175a0 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
175b0 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
175c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
175d0 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
175e0 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
175f0 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
17600 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
17610 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
17620 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
17630 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
17640 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
17650 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
17660 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
17670 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
17680 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
17690 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
176a0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
176b0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
176c0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
176d0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
176e0 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
176f0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
17700 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
17710 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17720 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61  OK ){.    u16 pa
17730 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
17740 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
17750 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
17760 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
17770 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
17780 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
17790 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67  ) );.    if( pag
177a0 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
177b0 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e!=pPager->pageS
177c0 69 7a 65 20 0a 20 20 20 20 20 26 26 20 28 70 50  ize .     && (pP
177d0 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
177e0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
177f0 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c  ==0).     && sql
17800 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
17810 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
17820 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20  he)==0 .    ){. 
17830 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20       char *pNew 
17840 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
17850 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
17860 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
17870 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !pNew ){.      
17880 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17890 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
178a0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
178b0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
178c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
178d0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
178e0 7a 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ze;.        sqli
178f0 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
17900 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
17910 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17920 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
17930 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17940 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
17950 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
17960 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
17970 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17980 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75   *pPageSize = (u
17990 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  16)pPager->pageS
179a0 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ize;.  }.  retur
179b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
179c0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
179d0 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
179e0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
179f0 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
17a00 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
17a10 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
17a20 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
17a30 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
17a40 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
17a50 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
17a60 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
17a70 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
17a80 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
17a90 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
17aa0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
17ab0 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
17ac0 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
17ad0 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
17ae0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
17af0 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
17b00 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
17b10 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
17b20 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
17b30 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
17b40 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
17b50 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
17b60 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
17b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
17b80 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
17b90 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
17ba0 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
17bb0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
17bc0 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
17bd0 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
17be0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
17bf0 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
17c00 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
17c10 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
17c20 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
17c30 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
17c40 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
17c50 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
17c60 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
17c70 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
17c80 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
17c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
17ca0 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
17cb0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
17cc0 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
17cd0 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67  ge>0 ){.    pPag
17ce0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50  er->mxPgno = mxP
17cf0 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  age;.  }.  sqlit
17d00 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
17d10 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72  (pPager, 0);.  r
17d20 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
17d30 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
17d40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
17d50 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
17d60 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
17d70 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
17d80 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
17d90 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
17da0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
17db0 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
17dc0 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
17dd0 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
17de0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
17df0 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
17e00 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
17e10 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
17e20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
17e30 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
17e40 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
17e50 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
17e60 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
17e70 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
17e80 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
17e90 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
17ea0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
17eb0 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
17ec0 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
17ed0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
17ee0 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
17ef0 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
17f00 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
17f10 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
17f20 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
17f30 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
17f40 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
17f50 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
17f60 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
17f70 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
17f80 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
17f90 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
17fa0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
17fb0 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
17fc0 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
17fd0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
17fe0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
17ff0 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
18000 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
18010 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
18020 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
18030 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
18040 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
18050 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
18060 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
18070 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
18080 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
18090 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
180a0 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
180b0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
180c0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
180d0 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
180e0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
180f0 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
18100 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
18110 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
18120 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
18130 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
18140 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
18150 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
18160 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
18170 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
18180 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
18190 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
181a0 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
181b0 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
181c0 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
181d0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
181e0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
181f0 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
18200 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
18210 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
18220 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
18230 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
18240 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
18250 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
18260 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
18270 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
18280 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
18290 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
182a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
182b0 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
182c0 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
182d0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
182e0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
182f0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
18300 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
18310 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
18320 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
18330 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
18340 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
18350 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
18360 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
18370 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
18380 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
18390 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
183a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
183b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
183c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
183d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
183e0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
183f0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
18400 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
18410 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70  iated .** with p
18420 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  Pager. Normally,
18430 20 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61   this is calcula
18440 74 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65  ted as (<db file
18450 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a   size>/<page-siz
18460 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c  e>)..** However,
18470 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
18480 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70  between 1 and <p
18490 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20  age-size> bytes 
184a0 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a  in size, then .*
184b0 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64  * this is consid
184c0 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66 69  ered a 1 page fi
184d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
184e0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72 72   pager is in err
184f0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
18500 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
18510 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  alled, then the.
18520 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  ** error state e
18530 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
18540 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67  urned and *pnPag
18550 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  e left unchanged
18560 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20  . Or,.** if the 
18570 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20  file system has 
18580 74 6f 20 62 65 20 71 75 65 72 69 65 64 20 66 6f  to be queried fo
18590 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
185a0 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68  e file and.** th
185b0 65 20 71 75 65 72 79 20 61 74 74 65 6d 70 74 20  e query attempt 
185c0 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72  returns an IO er
185d0 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ror, the IO erro
185e0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
185f0 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67  ed.** and *pnPag
18600 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
18610 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ged..**.** Other
18620 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68  wise, if everyth
18630 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
18640 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  l, then SQLITE_O
18650 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
18660 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
18670 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
18680 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
18690 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  e database..*/.i
186a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
186b0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
186c0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
186d0 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
186e0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
186f0 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65    /* Value to re
18700 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65  turn via *pnPage
18710 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   */..  /* If the
18720 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64   pager is alread
18730 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
18740 74 61 74 65 2c 20 72 65 74 75 72 6e 20 74 68 65  tate, return the
18750 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a   error code. */.
18760 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
18770 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
18780 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
18790 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ode;.  }..  /* D
187a0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d  etermine the num
187b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
187c0 74 68 65 20 66 69 6c 65 2e 20 53 74 6f 72 65 20  the file. Store 
187d0 74 68 69 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a  this in nPage. *
187e0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
187f0 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20  dbSizeValid ){. 
18800 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65     nPage = pPage
18810 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c  r->dbSize;.  }el
18820 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20  se{.    int rc; 
18830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18840 2f 2a 20 45 72 72 6f 72 20 72 65 74 75 72 6e 65  /* Error returne
18850 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28  d by OsFileSize(
18860 29 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d  ) */.    i64 n =
18870 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18880 20 2f 2a 20 46 69 6c 65 20 73 69 7a 65 20 69 6e   /* File size in
18890 20 62 79 74 65 73 20 72 65 74 75 72 6e 65 64 20   bytes returned 
188a0 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20  by OsFileSize() 
188b0 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
188c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
188d0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
188e0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
188f0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
18900 3e 66 64 29 20 26 26 20 28 30 20 21 3d 20 28 72  >fd) && (0 != (r
18910 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
18920 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
18930 2c 20 26 6e 29 29 29 20 29 7b 0a 20 20 20 20 20  , &n))) ){.     
18940 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
18950 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
18960 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18970 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
18980 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
18990 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  ze ){.      nPag
189a0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 1;.    }else
189b0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
189c0 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65  (Pgno)(n / pPage
189d0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
189e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
189f0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
18a00 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
18a10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
18a20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70  = nPage;.      p
18a30 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
18a40 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
18a50 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
18a60 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  alid = 1;.    }.
18a70 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
18a80 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
18a90 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
18aa0 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
18ab0 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63  than the .  ** c
18ac0 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75  onfigured maximu
18ad0 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20  m pager number, 
18ae0 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c  increase the all
18af0 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20  owed limit so.  
18b00 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  ** that the file
18b10 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20   can be read..  
18b20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70  */.  if( nPage>p
18b30 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
18b40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
18b50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67  gno = (Pgno)nPag
18b60 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  e;.  }..  /* Set
18b70 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
18b80 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20  able and return 
18b90 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69  SQLITE_OK */.  i
18ba0 66 28 20 70 6e 50 61 67 65 20 29 7b 0a 20 20 20  f( pnPage ){.   
18bb0 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
18bc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
18bd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
18be0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
18bf0 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
18c00 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
18c10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
18c20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
18c30 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
18c40 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
18c50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
18c60 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
18c70 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
18c80 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
18c90 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
18ca0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
18cb0 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
18cc0 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
18cd0 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
18ce0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
18cf0 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
18d00 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
18d10 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
18d20 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
18d30 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
18d40 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
18d50 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
18d60 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
18d70 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
18d80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
18d90 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
18da0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
18db0 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
18dc0 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
18dd0 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
18de0 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
18df0 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
18e00 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
18e10 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
18e20 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
18e30 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
18e40 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
18e50 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
18e60 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
18e70 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
18e80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18ea0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
18eb0 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f  ..  /* The OS lo
18ec0 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  ck values must b
18ed0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
18ee0 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c  e Pager lock val
18ef0 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ues */.  assert(
18f00 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
18f10 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
18f20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
18f30 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
18f40 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
18f50 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
18f60 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
18f70 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
18f80 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  he file is curre
18f90 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68  ntly unlocked th
18fa0 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74  en the size must
18fb0 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20   be unknown */. 
18fc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18fd0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
18fe0 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
18ff0 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
19000 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
19010 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65  at this is eithe
19020 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75  r a no-op (becau
19030 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64  se the requested
19040 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61   lock is .  ** a
19050 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20  lready held, or 
19060 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73  one of the trans
19070 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65  istions that the
19080 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20   busy-handler.  
19090 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65  ** may be invoke
190a0 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64  d during, accord
190b0 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65  ing to the comme
190c0 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71  nt above.  ** sq
190d0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
190e0 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f  yhandler()..  */
190f0 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
19100 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74  er->state>=lockt
19110 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ype).       || (
19120 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
19130 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c  AGER_UNLOCK && l
19140 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 53  ocktype==PAGER_S
19150 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
19160 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d   (pPager->state=
19170 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
19180 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47  && locktype==PAG
19190 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  ER_EXCLUSIVE).  
191a0 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
191b0 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
191c0 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  e ){.    rc = SQ
191d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
191e0 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
191f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
19200 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
19210 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d  locktype);.    }
19220 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
19230 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72  E_BUSY && pPager
19240 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70  ->xBusyHandler(p
19250 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
19260 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69  lerArg) );.    i
19270 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19280 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
19290 2d 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f  ->state = (u8)lo
192a0 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
192b0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
192c0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
192d0 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
192e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
192f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
19300 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
19310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
19320 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61  mage to nPage pa
19330 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ges. This .** fu
19340 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
19350 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20  actually modify 
19360 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19370 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a  e on disk. It .*
19380 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  * just sets the 
19390 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
193a0 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
193b0 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a  ct so that the .
193c0 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69  ** truncation wi
193d0 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20  ll be done when 
193e0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
193f0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
19400 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tted..*/.void sq
19410 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
19420 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70  teImage(Pager *p
19430 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
19440 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
19450 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
19460 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
19470 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
19480 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
19490 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
194a0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
194b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
194c0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a 0a  ize = nPage;.}..
194d0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
194e0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
194f0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
19500 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
19510 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
19520 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
19530 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
19540 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
19550 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
19560 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19570 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
19580 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
19590 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
195a0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
195b0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
195c0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
195d0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
195e0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
195f0 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
19600 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
19610 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
19620 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
19630 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
19640 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
19650 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
19660 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
19670 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
19680 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
19690 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
196a0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
196b0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
196c0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
196d0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
196e0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
196f0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
19700 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
19710 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
19720 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
19730 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
19740 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
19750 29 7b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  ){.  disable_sim
19760 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
19770 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
19780 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
19790 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
197a0 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
197b0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
197c0 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
197d0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
197e0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
197f0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
19800 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
19810 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e     /* Set Pager.
19820 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31  journalHdr to -1
19830 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74   for the benefit
19840 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c   of the pager_pl
19850 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a  ayback() .    **
19860 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20   call which may 
19870 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74  be made from wit
19880 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41  hin pagerUnlockA
19890 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66  ndRollback(). If
198a0 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f   it.    ** is no
198b0 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75  t -1, then the u
198c0 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
198d0 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  of an open journ
198e0 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20  al file may.    
198f0 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ** be played bac
19900 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
19910 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
19920 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
19930 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
19940 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
19950 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
19960 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
19970 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
19980 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
19990 2d 31 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c  -1;.    pagerUnl
199a0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
199b0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
199c0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
199d0 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
199e0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
199f0 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
19a00 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
19a10 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
19a20 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
19a30 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
19a40 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
19a50 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
19a60 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
19a70 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
19a80 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
19a90 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
19aa0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
19ab0 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  e);..  assert( !
19ac0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
19ad0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
19ae0 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
19af0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
19b00 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
19b10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
19b20 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
19b30 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
19b40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19b50 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
19b60 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
19b70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
19b80 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
19b90 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
19ba0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
19bb0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
19bc0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
19bd0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
19be0 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
19bf0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
19c00 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
19c10 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
19c20 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
19c30 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
19c40 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
19c50 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
19c60 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
19c70 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
19c80 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
19c90 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
19ca0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
19cb0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
19cc0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
19cd0 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
19ce0 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
19cf0 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
19d00 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
19d10 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
19d20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
19d30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
19d40 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
19d50 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
19d60 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
19d70 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
19d80 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  tion is a.** no-
19d90 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
19da0 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
19db0 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
19dc0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a  e journal-mode.*
19dd0 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65  * and the device
19de0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
19df0 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
19e00 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
19e10 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
19e20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
19e30 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
19e40 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
19e50 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
19e60 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
19e70 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
19e80 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
19e90 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
19ea0 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
19eb0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
19ec0 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
19ed0 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
19ee0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
19ef0 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
19f00 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
19f10 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
19f20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
19f30 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
19f40 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
19f50 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
19f60 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
19f70 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
19f80 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
19f90 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
19fa0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
19fb0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
19fc0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
19fd0 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
19fe0 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
19ff0 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1a000 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
1a010 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
1a020 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
1a030 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
1a040 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
1a050 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
1a060 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
1a070 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
1a080 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
1a090 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
1a0a0 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
1a0b0 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
1a0c0 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
1a0d0 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1a0e0 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
1a0f0 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
1a100 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
1a110 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
1a120 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
1a130 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
1a140 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65  ** The Pager.nee
1a150 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65  dSync flag is ne
1a160 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74  ver be set for t
1a170 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1a180 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f  or any.** file o
1a190 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73  perating in no-s
1a1a0 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e  ync mode (Pager.
1a1b0 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f  noSync set to no
1a1c0 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49  n-zero)..**.** I
1a1d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
1a1e0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
1a1f0 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
1a200 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
1a210 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
1a220 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
1a230 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
1a240 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
1a250 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
1a260 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1a270 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
1a280 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1a290 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1a2a0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1a2b0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
1a2c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a2d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
1a2e0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
1a2f0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1a300 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1a310 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1a320 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1a330 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1a340 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1a350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a370 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1a380 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
1a390 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1a3a0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1a3b0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1a3c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a3d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1a3e0 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
1a3f0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1a400 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1a410 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
1a420 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 52 65  /* Variable iNRe
1a430 63 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  cOffset is set t
1a440 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20  o the offset in 
1a450 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a460 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
1a470 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66  he nRec field of
1a480 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1a490 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e  ly written journ
1a4a0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1a4b0 20 20 20 2a 2a 20 54 68 69 73 20 66 69 65 6c 64     ** This field
1a4c0 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64   will be updated
1a4d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 78   following the x
1a4e0 53 79 6e 63 28 29 20 6f 70 65 72 61 74 69 6f 6e  Sync() operation
1a4f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  .        ** on t
1a500 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1a510 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
1a520 69 4e 52 65 63 4f 66 66 73 65 74 20 3d 20 70 50  iNRecOffset = pP
1a530 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1a540 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
1a550 61 6c 4d 61 67 69 63 29 3b 0a 0a 20 20 20 20 20  alMagic);..     
1a560 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
1a570 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
1a580 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
1a590 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
1a5a0 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
1a5b0 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
1a5c0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
1a5d0 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
1a5e0 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
1a5f0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
1a600 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
1a610 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
1a620 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
1a630 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
1a640 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
1a650 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
1a660 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
1a670 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
1a680 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
1a690 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
1a6a0 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
1a6b0 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
1a6c0 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
1a6d0 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
1a6e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 72  s connections tr
1a6f0 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
1a700 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
1a710 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
1a720 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
1a730 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
1a740 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
1a750 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
1a760 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
1a770 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
1a780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a790 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
1a7a0 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
1a7b0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1a7c0 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
1a7d0 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
1a7e0 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
1a7f0 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
1a800 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
1a810 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
1a820 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
1a830 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
1a840 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
1a850 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
1a860 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
1a870 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
1a880 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
1a890 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
1a8a0 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1a8b0 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
1a8c0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
1a8d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1a8e0 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
1a8f0 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
1a900 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
1a910 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
1a920 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
1a930 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
1a940 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
1a950 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
1a960 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
1a970 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
1a980 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
1a990 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
1a9a0 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
1a9b0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
1a9c0 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
1a9d0 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
1a9e0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
1a9f0 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
1aa00 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
1aa10 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
1aa20 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
1aa30 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
1aa40 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
1aa50 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
1aa60 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
1aa70 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
1aa80 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
1aa90 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
1aaa0 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
1aab0 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
1aac0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1aad0 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
1aae0 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  set = journalHdr
1aaf0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
1ab00 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
1ab10 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 72 63  c[8];.        rc
1ab20 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1ab30 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
1ab40 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
1ab50 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1ab60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ab70 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
1ab80 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
1ab90 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
1aba0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
1abb0 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
1abc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1abd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1abe0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
1abf0 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
1ac00 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
1ac10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ac20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ac30 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1ac40 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1ac50 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1ac60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1ac70 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1ac80 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
1ac90 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
1aca0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
1acb0 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
1acc0 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
1acd0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
1ace0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
1acf0 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
1ad00 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1ad10 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
1ad20 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
1ad30 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
1ad40 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
1ad50 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
1ad60 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
1ad70 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
1ad80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1ad90 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
1ada0 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
1adb0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
1adc0 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
1add0 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
1ade0 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
1adf0 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
1ae00 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
1ae10 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
1ae20 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
1ae30 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
1ae40 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
1ae50 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
1ae60 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
1ae70 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
1ae80 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
1ae90 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1aea0 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
1aeb0 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
1aec0 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
1aed0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1aee0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1aef0 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
1af00 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1af10 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
1af20 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1af30 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
1af40 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
1af50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1af60 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
1af70 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
1af80 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1af90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1afa0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1afb0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
1afc0 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  nc_flags);.     
1afd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1afe0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1aff0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1b000 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1b010 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
1b020 6e 22 2c 20 70 50 61 67 65 72 2c 20 69 4e 52 65  n", pPager, iNRe
1b030 63 4f 66 66 73 65 74 2c 20 34 29 29 3b 0a 20 20  cOffset, 4));.  
1b040 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1b050 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
1b060 66 64 2c 20 69 4e 52 65 63 4f 66 66 73 65 74 2c  fd, iNRecOffset,
1b070 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
1b080 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1b090 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b0a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1b0b0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
1b0c0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
1b0d0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
1b0e0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1b0f0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
1b100 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
1b110 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
1b120 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
1b130 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1b140 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
1b150 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1b160 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1b170 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20  er->sync_flags| 
1b180 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
1b190 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d  er->sync_flags==
1b1a0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1b1b0 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
1b1c0 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
1b1d0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1b1e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b1f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b200 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1b210 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1b220 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63 65  e was just succe
1b230 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
1b240 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53 79  Set Pager.needSy
1b250 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a 65  nc .    ** to ze
1b260 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  ro and clear the
1b270 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1b280 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61 67   flag on all pag
1b290 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ess..    */.    
1b2a0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1b2b0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1b2c0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1b2d0 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
1b2e0 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
1b2f0 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
1b300 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  Cache);.  }..  r
1b310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1b330 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
1b340 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
1b350 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
1b360 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
1b370 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
1b380 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
1b390 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
1b3a0 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
1b3b0 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
1b3c0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
1b3d0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1b3e0 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
1b3f0 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
1b400 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
1b410 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
1b420 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1b430 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
1b440 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
1b450 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
1b460 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
1b470 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1b480 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1b490 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
1b4a0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
1b4b0 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
1b4c0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
1b4d0 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
1b4e0 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
1b4f0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
1b500 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
1b510 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
1b520 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1b530 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
1b540 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1b550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b560 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
1b570 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
1b580 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
1b590 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1b5a0 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
1b5b0 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
1b5c0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
1b5d0 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
1b5e0 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
1b5f0 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
1b600 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
1b610 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
1b620 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
1b630 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
1b640 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
1b650 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
1b660 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1b670 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
1b680 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
1b690 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
1b6a0 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
1b6b0 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
1b6c0 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
1b6d0 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
1b6e0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
1b6f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
1b700 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
1b710 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
1b720 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
1b730 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
1b740 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
1b750 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
1b760 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
1b770 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1b780 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
1b790 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
1b7a0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
1b7b0 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
1b7c0 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
1b7d0 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
1b7e0 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
1b7f0 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
1b800 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
1b810 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
1b820 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
1b830 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
1b840 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
1b850 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
1b860 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1b870 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1b880 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
1b890 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1b8a0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
1b8b0 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
1b8c0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
1b8d0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
1b8e0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1b8f0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1b900 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
1b910 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
1b920 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
1b930 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b950 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1b960 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b980 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1b990 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
1b9a0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
1b9b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b9c0 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
1b9d0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
1b9e0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
1b9f0 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
1ba00 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
1ba10 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1ba20 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
1ba30 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
1ba40 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
1ba50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
1ba60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
1ba70 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  ** call is a no-
1ba80 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  op..  **.  ** Mo
1ba90 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
1baa0 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
1bab0 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
1bac0 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
1bad0 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
1bae0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
1baf0 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
1bb00 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
1bb10 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
1bb20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
1bb30 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
1bb40 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
1bb50 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
1bb60 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
1bb70 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
1bb80 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
1bb90 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
1bba0 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
1bbb0 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
1bbc0 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
1bbd0 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
1bbe0 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
1bbf0 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
1bc00 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
1bc10 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
1bc20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
1bc30 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
1bc40 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
1bc50 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
1bc60 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
1bc70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
1bc80 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
1bc90 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
1bca0 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
1bcb0 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
1bcc0 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
1bcd0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
1bce0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
1bcf0 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
1bd00 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
1bd10 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
1bd20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
1bd30 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ck..  */.  asser
1bd40 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1bd50 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1bd60 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
1bd70 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1bd80 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
1bd90 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  LOCK);..  /* If 
1bda0 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
1bdb0 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
1bdc0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
1bdd0 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
1bde0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
1bdf0 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
1be00 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
1be10 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
1be20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
1be30 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
1be40 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
1be50 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
1be60 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
1be70 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
1be80 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
1be90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
1bea0 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
1beb0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
1bec0 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
1bed0 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
1bee0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
1bef0 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
1bf00 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1bf10 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
1bf20 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
1bf30 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
1bf40 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1bf50 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
1bf60 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
1bf70 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
1bf80 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
1bf90 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
1bfa0 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
1bfb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1bfc0 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
1bfd0 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
1bfe0 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
1bff0 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
1c000 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
1c010 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
1c020 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
1c030 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
1c040 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1c050 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
1c060 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
1c070 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
1c080 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
1c090 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
1c0a0 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
1c0b0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1c0c0 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
1c0d0 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
1c0e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
1c0f0 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
1c100 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1c110 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
1c120 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
1c130 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1c140 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
1c150 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
1c160 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
1c170 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
1c180 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
1c190 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 29 3b  pData, pgno, 6);
1c1a0 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74   /* Data to writ
1c1b0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57  e */..      /* W
1c1c0 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67  rite out the pag
1c1d0 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20  e data. */.     
1c1e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1c1f0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
1c200 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
1c210 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1c220 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
1c230 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20  page 1 was just 
1c240 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
1c250 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1c260 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20   to match.      
1c270 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77  ** the value now
1c280 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64   stored in the d
1c290 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1c2a0 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20   writing this . 
1c2b0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75       ** page cau
1c2c0 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  sed the database
1c2d0 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75   file to grow, u
1c2e0 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65  pdate dbFileSize
1c2f0 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1c300 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1c310 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1c320 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1c330 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
1c340 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1c350 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1c360 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c370 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
1c380 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
1c390 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1c3a0 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20  eSize = pgno;.  
1c3b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1c3c0 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
1c3d0 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
1c3e0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
1c3f0 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
1c400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
1c410 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
1c420 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
1c430 2c 20 28 75 38 20 2a 29 70 44 61 74 61 29 3b 0a  , (u8 *)pData);.
1c440 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
1c450 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
1c460 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1c470 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1c480 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1c490 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1c4a0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
1c4b0 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
1c4c0 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
1c4d0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1c4e0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
1c4f0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1c500 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
1c510 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
1c520 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1c530 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Write);.    }els
1c540 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
1c550 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
1c560 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1c570 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
1c580 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  no));.    }.#ifd
1c590 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1c5a0 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
1c5b0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
1c5c0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
1c5d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
1c5e0 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
1c5f0 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
1c600 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c610 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
1c620 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
1c630 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
1c640 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
1c650 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74  nal. .** It is t
1c660 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
1c670 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65  nsibility to use
1c680 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
1c690 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a  e() to check .**
1c6a0 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c   that it is real
1c6b0 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ly required befo
1c6c0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
1c6d0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
1c6e0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
1c6f0 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
1c700 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
1c710 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
1c720 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
1c730 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
1c740 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1c750 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
1c760 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
1c770 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
1c780 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
1c790 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
1c7a0 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
1c7b0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
1c7c0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
1c7d0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
1c7e0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
1c7f0 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
1c800 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
1c810 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
1c820 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
1c830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
1c840 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
1c850 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
1c860 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c870 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c880 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1c890 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1c8a0 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
1c8b0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
1c8c0 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 69 36  g->pData;.    i6
1c8d0 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
1c8e0 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
1c8f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c900 0a 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61  .    char *pData
1c910 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1c920 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1c930 67 6e 6f 2c 20 37 29 3b 0a 20 20 0a 20 20 20 20  gno, 7);.  .    
1c940 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
1c950 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
1c960 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1c970 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1c980 67 6e 6f 29 29 3b 0a 20 20 0a 20 20 20 20 61 73  gno));.  .    as
1c990 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72  sert( pageInJour
1c9a0 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  nal(pPg) || pPg-
1c9b0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
1c9c0 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
1c9d0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
1c9e0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
1c9f0 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
1ca00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1ca10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ca20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ca30 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  Write(pPager->sj
1ca40 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
1ca50 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
1ca60 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 7d 0a 20  fset+4);.    }. 
1ca70 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1ca80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
1ca90 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b  ager->nSubRec++;
1caa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1cab0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
1cac0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
1cad0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
1cae0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
1caf0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 74 65 73 74  >pgno);.    test
1cb00 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1cb10 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  _OK );.  }.  ret
1cb20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1cb30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1cb40 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
1cb50 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68   pcache layer wh
1cb60 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65  en it has reache
1cb70 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d  d some.** soft m
1cb80 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65  emory limit. The
1cb90 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1cba0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1cbb0 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a  a Pager object.*
1cbc0 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69  * (cast as a voi
1cbd0 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69  d*). The pager i
1cbe0 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61  s always 'purgea
1cbf0 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d  ble' (not an in-
1cc00 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
1cc10 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  se). The second 
1cc20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65  argument is a re
1cc30 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67  ference to a pag
1cc40 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75  e that is .** cu
1cc50 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75  rrently dirty bu
1cc60 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  t has no outstan
1cc70 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
1cc80 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   The page.** is 
1cc90 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65  always associate
1cca0 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72  d with the Pager
1ccb0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
1ccc0 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
1ccd0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
1cce0 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
1ccf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d  function is to m
1cd00 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79  ake pPg clean by
1cd10 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e   writing its con
1cd20 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20  tents.** out to 
1cd30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1cd40 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20  e, if possible. 
1cd50 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65  This may involve
1cd60 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20   syncing the.** 
1cd70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a  journal file. .*
1cd80 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1cd90 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68  ul, sqlite3Pcach
1cda0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
1cdb0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61  called on the pa
1cdc0 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ge and.** SQLITE
1cdd0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
1cde0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1cdf0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
1ce00 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
1ce10 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20  page clean, the 
1ce20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1ce30 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68   returned. If th
1ce40 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65  e page cannot be
1ce50 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66  .** made clean f
1ce60 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65  or some other re
1ce70 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72  ason, but no err
1ce80 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
1ce90 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
1cea0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1ceb0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
1cec0 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c  an() is not call
1ced0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1cee0 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
1cef0 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
1cf00 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1cf10 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1cf20 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1cf30 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1cf40 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
1cf50 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
1cf60 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  rt( pPg->flags&P
1cf70 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20  GHDR_DIRTY );.. 
1cf80 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e   /* The doNotSyn
1cf90 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79  c flag is set by
1cfa0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1cfb0 72 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f  rWrite() functio
1cfc0 6e 20 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20  n while it.  ** 
1cfd0 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61  is journalling a
1cfe0 20 73 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d   set of two or m
1cff0 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
1d000 65 73 20 74 68 61 74 20 61 72 65 20 73 74 6f 72  es that are stor
1d010 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73  ed.  ** on the s
1d020 61 6d 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  ame disk sector.
1d030 20 53 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75   Syncing the jou
1d040 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rnal is not allo
1d050 77 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74  wed while.  ** t
1d060 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
1d070 20 61 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74   as it is import
1d080 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d  ant that all mem
1d090 62 65 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20  bers of such a. 
1d0a0 20 2a 2a 20 73 65 74 20 6f 66 20 70 61 67 65 73   ** set of pages
1d0b0 20 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64   are synced to d
1d0c0 69 73 6b 20 74 6f 67 65 74 68 65 72 2e 20 53 6f  isk together. So
1d0d0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 74 68  , if the page th
1d0e0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
1d0f0 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20 6d 61   is trying to ma
1d100 6b 65 20 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65  ke clean will re
1d110 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
1d120 73 79 6e 63 20 61 6e 64 20 74 68 65 20 64 6f 4e  sync and the doN
1d130 6f 74 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67  otSync.  ** flag
1d140 20 69 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20   is set, return 
1d150 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1d160 79 74 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63  ything. The pcac
1d170 68 65 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20  he layer will.  
1d180 2a 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20  ** just have to 
1d190 67 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c  go ahead and all
1d1a0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1d1b0 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20   buffer instead 
1d1c0 6f 66 0a 20 20 2a 2a 20 72 65 75 73 69 6e 67 20  of.  ** reusing 
1d1d0 70 50 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  pPg..  **.  ** S
1d1e0 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65  imilarly, if the
1d1f0 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
1d200 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
1d210 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
1d220 6f 74 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 77  ot.  ** try to w
1d230 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
1d240 73 20 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b  s of pPg to disk
1d250 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
1d260 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
1d270 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79  (pPager->doNotSy
1d280 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c 61 67 73  nc && pPg->flags
1d290 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1d2a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1d2b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1d2c0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
1d2d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
1d2e0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28  quired. */.  if(
1d2f0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d300 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
1d310 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
1d320 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1d330 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d340 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
1d350 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20 20  llSync && .     
1d360 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   !(pPager->journ
1d370 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
1d380 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1d390 29 20 26 26 0a 20 20 20 20 20 20 21 28 73 71 6c  ) &&.      !(sql
1d3a0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1d3b0 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1d3c0 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
1d3d0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1d3e0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  ).    ){.      p
1d3f0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1d400 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
1d410 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
1d420 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
1d430 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
1d440 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
1d450 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
1d460 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
1d470 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  size of.  ** the
1d480 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
1d490 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
1d4a0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
1d4b0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
1d4c0 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
1d4d0 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  use the call to 
1d4e0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1d4f0 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c  list() below wil
1d500 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61 63 74 75 61  l not.  ** actua
1d510 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20 74  lly write data t
1d520 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68  o the file in th
1d530 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
1d540 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
1d550 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e  following sequen
1d560 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20  ce of events:.  
1d570 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  **.  **   BEGIN;
1d580 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e  .  **     <journ
1d590 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20  al page X>.  ** 
1d5a0 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65      <modify page
1d5b0 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56   X>.  **     SAV
1d5c0 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 2a 2a 20  EPOINT sp;.  ** 
1d5d0 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61        <shrink da
1d5e0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59  tabase file to Y
1d5f0 20 70 61 67 65 73 3e 0a 20 20 2a 2a 20 20 20 20   pages>.  **    
1d600 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70     pagerStress(p
1d610 61 67 65 20 58 29 0a 20 20 2a 2a 20 20 20 20 20  age X).  **     
1d620 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a  ROLLBACK TO sp;.
1d630 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 28 58 3e    **.  ** If (X>
1d640 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
1d650 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
1d660 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
1d670 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
1d680 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
1d690 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
1d6a0 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
1d6b0 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
1d6c0 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a 20 66 6f 6c  . Then,.  ** fol
1d6d0 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c  lowing the "ROLL
1d6e0 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74  BACK TO sp" stat
1d6f0 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70  ement, reading p
1d700 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a  age X will read.
1d710 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
1d720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d730 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74  . This will be t
1d740 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20  he copy of page 
1d750 58 20 61 73 20 69 74 0a 20 20 2a 2a 20 77 61 73  X as it.  ** was
1d760 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1d770 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e  ction started, n
1d780 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ot as it was whe
1d790 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22  n "SAVEPOINT sp"
1d7a0 0a 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74  .  ** was execut
1d7b0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ed..  **.  ** Th
1d7c0 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
1d7d0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
1d7e0 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65  nt data for page
1d7f0 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a   X into the .  *
1d800 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
1d810 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
1d820 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
1d830 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
1d840 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 73  will.  ** be res
1d850 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
1d860 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
1d870 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
1d880 20 73 70 22 20 69 73 20 0a 20 20 2a 2a 20 65 78   sp" is .  ** ex
1d890 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  ecuted..  */.  i
1d8a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d8b0 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   && pPg->pgno>pP
1d8c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
1d8d0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
1d8e0 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 63 20  (pPg) ){.    rc 
1d8f0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
1d900 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  (pPg);.  }..  /*
1d910 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
1d920 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
1d930 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
1d940 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 69  ase file. */.  i
1d950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d960 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   ){.    pPg->pDi
1d970 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
1d980 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
1d990 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d  gelist(pPg);.  }
1d9a0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1d9b0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a  page as clean. *
1d9c0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1d9d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47  TE_OK ){.    PAG
1d9e0 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53  ERTRACE(("STRESS
1d9f0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1da00 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1da10 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1da20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
1da30 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
1da40 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67   }..  return pag
1da50 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1da60 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   rc);.}.../*.** 
1da70 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
1da80 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
1da90 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
1daa0 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
1dab0 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
1dac0 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
1dad0 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
1dae0 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
1daf0 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
1db00 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
1db10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
1db20 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
1db30 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
1db40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1db50 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
1db60 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
1db70 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
1db80 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
1db90 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
1dba0 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
1dbb0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
1dbc0 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
1dbd0 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
1dbe0 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
1dbf0 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
1dc00 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
1dc10 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
1dc20 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
1dc30 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
1dc40 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
1dc50 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
1dc60 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
1dc70 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
1dc80 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
1dc90 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
1dca0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
1dcb0 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
1dcc0 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
1dcd0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1dce0 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
1dcf0 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
1dd00 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
1dd10 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
1dd20 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
1dd30 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
1dd40 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
1dd50 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
1dd60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
1dd70 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
1dd80 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
1dd90 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
1dda0 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
1ddb0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
1ddc0 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
1ddd0 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
1dde0 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
1ddf0 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
1de00 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
1de10 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  d PAGER_NO_READL
1de20 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  OCK flags..**.**
1de30 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
1de40 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
1de50 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
1de60 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
1de70 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
1de80 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
1de90 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
1dea0 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
1deb0 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
1dec0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
1ded0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
1dee0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
1def0 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
1df00 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
1df10 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1df20 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
1df30 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
1df40 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
1df50 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
1df60 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
1df70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
1df80 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
1df90 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
1dfa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1dfb0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
1dfc0 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
1dfd0 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
1dfe0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
1dff0 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
1e000 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
1e010 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
1e020 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
1e030 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1e040 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
1e050 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1e060 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
1e070 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
1e080 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
1e090 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
1e0a0 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
1e0b0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
1e0c0 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
1e0d0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1e0e0 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
1e0f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1e100 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
1e110 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
1e120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
1e130 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
1e140 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
1e150 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
1e160 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1e170 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
1e180 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
1e190 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
1e1a0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
1e1b0 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
1e1c0 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
1e1d0 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
1e1e0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
1e1f0 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
1e200 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1e210 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
1e220 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
1e230 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
1e240 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1e250 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e260 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
1e270 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
1e280 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
1e290 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
1e2a0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
1e2b0 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
1e2c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1e2d0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
1e2e0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
1e2f0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
1e300 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
1e310 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1e320 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
1e330 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
1e340 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
1e350 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
1e360 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
1e370 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
1e380 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
1e390 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
1e3a0 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
1e3b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1e3c0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
1e3d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e3e0 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
1e3f0 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
1e400 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
1e410 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
1e420 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
1e430 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
1e440 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  rnal */.  int no
1e450 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
1e460 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
1e470 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54  DLOCK)!=0;  /* T
1e480 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64  rue to omit read
1e490 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  -lock */.  int p
1e4a0 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
1e4b0 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
1e4c0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
1e4d0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
1e4e0 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20  PCache */.  u16 
1e4f0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
1e500 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
1e510 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
1e520 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
1e530 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1e540 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1e550 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
1e560 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
1e570 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
1e580 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
1e590 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
1e5a0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
1e5b0 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
1e5c0 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
1e5d0 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
1e5e0 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
1e5f0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
1e600 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
1e610 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
1e620 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
1e630 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
1e640 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
1e650 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
1e660 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
1e670 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
1e680 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
1e690 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
1e6a0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
1e6b0 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
1e6c0 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
1e6d0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
1e6e0 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
1e6f0 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
1e700 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
1e710 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
1e720 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
1e730 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
1e740 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
1e750 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  leSize = sqlite3
1e760 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
1e770 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1e780 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1e790 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  = sqlite3MemJour
1e7a0 6e 61 6c 53 69 7a 65 28 29 3b 0a 20 20 7d 0a 0a  nalSize();.  }..
1e7b0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
1e7c0 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
1e7d0 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
1e7e0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
1e7f0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
1e800 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61  ..  /* Compute a
1e810 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c  nd store the ful
1e820 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e  l pathname in an
1e830 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65   allocated buffe
1e840 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74  r pointed.  ** t
1e850 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20  o by zPathname, 
1e860 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65  length nPathname
1e870 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73  . Or, if this is
1e880 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1e890 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f  e,.  ** leave bo
1e8a0 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64  th nPathname and
1e8b0 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74   zPathname set t
1e8c0 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  o 0..  */.  if( 
1e8d0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
1e8e0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
1e8f0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
1e900 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
1e910 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
1e920 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
1e930 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
1e940 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
1e950 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1e960 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1e970 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1e980 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
1e990 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
1e9a0 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
1e9b0 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
1e9c0 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
1e9d0 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30       zPathname[0
1e9e0 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ] = 0;.    }else
1e9f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
1ea00 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
1ea10 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75   = 0; /* Make su
1ea20 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65  re initialized e
1ea30 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e  ven if FullPathn
1ea40 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20  ame() fails */. 
1ea50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ea60 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
1ea70 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
1ea80 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
1ea90 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  hname);.    }.. 
1eaa0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
1eab0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1eac0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
1ead0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1eae0 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
1eaf0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1eb00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1eb10 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
1eb20 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
1eb30 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
1eb40 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
1eb50 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
1eb60 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
1eb70 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
1eb80 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
1eb90 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
1eba0 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
1ebb0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
1ebc0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
1ebd0 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
1ebe0 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
1ebf0 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
1ec00 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
1ec10 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
1ec20 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
1ec30 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
1ec40 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
1ec50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1ec60 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20  ANTOPEN;.    }. 
1ec70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ec80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1ec90 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
1eca0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
1ecb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ecc0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
1ecd0 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
1ece0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
1ecf0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
1ed00 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
1ed10 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
1ed20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ed30 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1ed40 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
1ed50 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
1ed60 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
1ed70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1ed80 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
1ed90 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1eda0 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
1edb0 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
1edc0 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
1edd0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1ede0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1edf0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
1ee00 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
1ee10 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
1ee20 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
1ee30 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
1ee40 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
1ee50 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
1ee60 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
1ee70 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1ee80 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1ee90 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
1eea0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
1eeb0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
1eec0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1eed0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
1eee0 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
1eef0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
1ef00 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
1ef10 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
1ef30 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
1ef40 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
1ef50 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
1ef60 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73  allocZero(.    s
1ef70 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
1ef80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1ef90 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
1efa0 0a 20 20 20 20 70 63 61 63 68 65 53 69 7a 65 20  .    pcacheSize 
1efb0 20 20 20 20 20 2b 20 20 20 20 20 20 20 20 20 20       +          
1efc0 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
1efd0 74 20 2a 2f 0a 20 20 20 20 70 56 66 73 2d 3e 73  t */.    pVfs->s
1efe0 7a 4f 73 46 69 6c 65 20 20 2b 20 20 20 20 20 20  zOsFile  +      
1eff0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
1f000 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
1f010 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1f020 2a 20 32 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  * 2 +       /* T
1f030 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  he two journal f
1f040 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61  iles */ .    nPa
1f050 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20  thname + 1 +    
1f060 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
1f070 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61  ename */.    nPa
1f080 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20  thname + 8 + 1  
1f090 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
1f0a0 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  rnal */.  );.  i
1f0b0 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
1f0c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
1f0d0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
1f0e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1f0f0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
1f110 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
1f120 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
1f130 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
1f140 50 74 72 20 2b 3d 20 73 69 7a 65 6f 66 28 2a 70  Ptr += sizeof(*p
1f150 50 61 67 65 72 29 29 3b 0a 20 20 70 50 61 67 65  Pager));.  pPage
1f160 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74  r->fd =   (sqlit
1f170 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
1f180 3d 20 70 63 61 63 68 65 53 69 7a 65 29 3b 0a 20  = pcacheSize);. 
1f190 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
1f1a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
1f1b0 70 50 74 72 20 2b 3d 20 70 56 66 73 2d 3e 73 7a  pPtr += pVfs->sz
1f1c0 4f 73 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65  OsFile);.  pPage
1f1d0 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74  r->jfd =  (sqlit
1f1e0 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
1f1f0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
1f200 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
1f210 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68  ilename =    (ch
1f220 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  ar*)(pPtr += jou
1f230 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 0a  rnalFileSize);..
1f240 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
1f250 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
1f260 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
1f270 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
1f280 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
1f290 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
1f2a0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
1f2b0 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
1f2c0 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
1f2d0 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d  me + 1);.    mem
1f2e0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
1f2f0 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
1f300 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
1f310 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
1f320 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68  >zJournal, zPath
1f330 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
1f340 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
1f350 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
1f360 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
1f370 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 73  rnal", 8);.    s
1f380 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
1f390 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
1f3a0 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
1f3b0 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
1f3c0 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
1f3d0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
1f3e0 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
1f3f0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
1f400 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
1f410 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20  ] && !memDb ){. 
1f420 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
1f450 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70   returned by xOp
1f460 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d  en() */.    rc =
1f470 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1f480 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
1f490 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
1f4a0 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66  fd, vfsFlags, &f
1f4b0 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  out);.    readOn
1f4c0 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
1f4d0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
1f4e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1f4f0 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
1f500 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
1f510 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
1f520 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
1f530 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
1f540 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
1f550 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
1f560 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1f570 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
1f580 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1f590 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
1f5a0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
1f5b0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
1f5c0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
1f5d0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
1f5e0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1f5f0 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
1f600 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
1f610 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
1f620 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
1f630 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
1f640 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
1f650 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1f660 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
1f670 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65  Only ){.      se
1f680 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
1f690 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
1f6a0 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
1f6b0 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
1f6c0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1f6d0 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
1f6e0 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
1f6f0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1f700 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ze ){.        if
1f710 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
1f720 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
1f730 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1f740 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
1f750 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
1f760 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1f770 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
1f780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f790 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
1f7a0 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65 63  (u16)pPager->sec
1f7b0 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
1f7c0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65   }.      }.#ifde
1f7d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f7e0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
1f7f0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74     {.        int
1f800 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1f810 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1f820 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1f830 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
1f840 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
1f850 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
1f860 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
1f870 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
1f880 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
1f890 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
1f8a0 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
1f8b0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
1f8c0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1f8d0 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
1f8e0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
1f8f0 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
1f900 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1f910 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
1f920 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  *2){.          i
1f930 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
1f940 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
1f950 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
1f960 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
1f970 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ii;.          }
1f980 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f990 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1f9a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1f9b0 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
1f9c0 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
1f9d0 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
1f9e0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
1f9f0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
1fa00 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
1fa10 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
1fa20 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
1fa30 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
1fa40 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
1fa50 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
1fa60 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
1fa70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1fa80 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
1fa90 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
1faa0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1fab0 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
1fac0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1fad0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
1fae0 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
1faf0 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
1fb00 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
1fb10 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
1fb20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
1fb30 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
1fb40 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
1fb50 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1fb60 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1fb70 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 0a  EXCLUSIVE;.  }..
1fb80 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1fb90 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
1fba0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
1fbb0 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
1fbc0 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
1fbd0 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
1fbe0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
1fbf0 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
1fc00 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
1fc10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fc20 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1fc30 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
1fc40 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
1fc50 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
1fc60 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
1fc70 73 7a 50 61 67 65 44 66 6c 74 29 3b 0a 20 20 20  szPageDflt);.   
1fc80 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1fc90 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1fca0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
1fcb0 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74  r occured in eit
1fcc0 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
1fcd0 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
1fce0 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74  e .  ** Pager st
1fcf0 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
1fd00 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  e the file..  */
1fd10 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1fd20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1fd30 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d  rt( !pPager->pTm
1fd40 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71  pSpace );.    sq
1fd50 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
1fd60 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
1fd70 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
1fd80 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
1fd90 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  c;.  }..  /* Ini
1fda0 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
1fdb0 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
1fdc0 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
1fdd0 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
1fde0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
1fdf0 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
1fe00 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
1fe10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fe20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
1fe30 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
1fe40 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
1fe50 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
1fe60 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
1fe70 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
1fe80 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
1fe90 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
1fea0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
1feb0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
1fec0 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
1fed0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1fee0 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
1fef0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
1ff00 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
1ff10 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
1ff20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26  = (noReadlock &&
1ff30 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b   readOnly) ?1:0;
1ff40 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
1ff50 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
1ff60 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
1ff70 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
1ff80 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
1ff90 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
1ffa0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
1ffb0 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20  (u8)memDb;.  /* 
1ffc0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1ffd0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
1ffe0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
1fff0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20000 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
20010 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
20020 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
20030 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
20040 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
20050 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
20060 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
20070 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
20080 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
20090 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
200a0 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
200b0 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
200c0 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
200d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
200e0 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
200f0 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
20100 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
20110 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
20120 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
20130 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
20140 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
20150 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
20160 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
20170 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
20180 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
20190 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
201a0 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
201b0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
201c0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
201d0 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
201e0 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
201f0 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
20200 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
20210 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
20220 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
20230 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  /.  pPager->noSy
20240 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 74 65  nc = (pPager->te
20250 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
20260 75 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70  urnal) ?1:0;.  p
20270 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
20280 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
20290 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d   ?0:1;.  pPager-
202a0 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51  >sync_flags = SQ
202b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
202c0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
202d0 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
202e0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
202f0 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
20300 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
20310 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
20320 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45  ger->nExtra = nE
20330 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
20340 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
20350 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
20360 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
20370 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
20380 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
20390 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
203a0 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
203b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
203c0 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
203d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
203e0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
203f0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
20400 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
20410 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
20420 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20430 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
20440 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65   = 0; */.  /* me
20450 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
20460 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
20470 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
20480 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  /.  *ppPager = p
20490 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
204a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
204b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
204c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
204d0 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
204e0 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
204f0 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
20500 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
20510 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
20520 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
20530 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
20540 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
20550 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
20560 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
20570 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
20580 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
20590 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
205a0 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
205b0 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
205c0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
205d0 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
205e0 77 69 6e 67 20 74 68 72 65 65 20 63 72 69 74 65  wing three crite
205f0 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
20600 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
20610 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
20620 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
20630 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
20640 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
20650 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
20660 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
20670 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
20680 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
20690 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
206a0 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
206b0 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
206c0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
206d0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
206e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
206f0 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
20700 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
20710 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
20720 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
20730 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
20740 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
20750 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
20760 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
20770 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
20780 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
20790 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
207a0 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
207b0 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
207c0 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
207d0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
207e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
207f0 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6f 70  tine does not op
20800 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
20810 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 69  ile to examine i
20820 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20  ts.** content.  
20830 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f 75 72 6e  Hence, the journ
20840 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
20850 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
20860 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
20870 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 62   file that has b
20880 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 61 6e 64  een deleted, and
20890 20 68 65 6e 63 65 20 6e 6f 74 20 62 65 20 68 6f   hence not be ho
208a0 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65 20 68 65  t.  Or.** the he
208b0 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
208c0 6e 61 6c 20 6d 69 67 68 74 20 62 65 20 7a 65 72  nal might be zer
208d0 6f 65 64 20 6f 75 74 2e 20 20 54 68 69 73 20 72  oed out.  This r
208e0 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 6e  outine.** does n
208f0 6f 74 20 64 69 73 63 6f 76 65 72 20 74 68 65 73  ot discover thes
20900 65 20 63 61 73 65 73 20 6f 66 20 61 20 6e 6f 6e  e cases of a non
20910 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d 20 69  -hot journal - i
20920 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  f the.** journal
20930 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
20940 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 74 68   is not empty th
20950 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d  is routine assum
20960 65 73 20 69 74 0a 2a 2a 20 69 73 20 68 6f 74 2e  es it.** is hot.
20970 20 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79    The pager_play
20980 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  back() routine w
20990 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
209a0 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  t the.** journal
209b0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
209c0 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77 69 6c 6c  lly hot and will
209d0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
209e0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
209f0 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
20a00 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
20a10 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
20a20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
20a30 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
20a40 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
20a50 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
20a60 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
20a70 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
20a80 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
20a90 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
20aa0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
20ab0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
20ac0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
20ad0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
20ae0 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
20af0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
20b00 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
20b10 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
20b20 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
20b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
20b40 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
20b50 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
20b60 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
20b70 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
20b80 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
20b90 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20  pVfs;.  int rc; 
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bb0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20bc0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
20bd0 69 73 74 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ists = 0;       
20be0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20bf0 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
20c00 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
20c10 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
20c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c30 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
20c40 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
20c50 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
20c60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
20c70 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
20c80 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
20c90 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
20ca0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
20cb0 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 2a 70 45 78  ->fd) );..  *pEx
20cc0 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  ists = 0;.  rc =
20cd0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
20ce0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
20cf0 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
20d00 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
20d10 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72  exists);.  if( r
20d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20d30 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 72 63  exists ){.    rc
20d40 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
20d50 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
20d60 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
20d70 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
20d80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
20d90 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  cked ){.      in
20da0 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  t nPage;.      r
20db0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20dc0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
20dd0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
20de0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20df0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 69 66 28  OK ){.       if(
20e00 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
20e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
20e20 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
20e30 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
20e40 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
20e50 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 45 78  {.          *pEx
20e60 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
20e70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20e80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
20e90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
20ea0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72   the content for
20eb0 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
20ec0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20ed0 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20  le and into .** 
20ee0 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68  pPg->pData. A sh
20ef0 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65  ared lock or gre
20f00 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
20f10 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
20f20 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65  e.** file before
20f30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
20f40 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
20f50 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61  If page 1 is rea
20f60 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  d, then the valu
20f70 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
20f80 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74  eVers[] is set t
20f90 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  o.** the value r
20fa0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
20fb0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
20fc0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
20fd0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
20fe0 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65  e IO error is re
20ff0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
21000 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  ller..** Otherwi
21010 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
21020 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
21030 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
21040 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
21050 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
21060 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20   = pPg->pPager; 
21070 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
21080 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
21090 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67  page pPg */.  Pg
210a0 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
210b0 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  gno;       /* Pa
210c0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61  ge number to rea
210d0 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  d */.  int rc;  
210e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
21100 64 65 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66  de */.  i64 iOff
21110 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
21120 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
21130 73 65 74 20 6f 66 20 66 69 6c 65 20 74 6f 20 72  set of file to r
21140 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a 20 20 61  ead from */..  a
21150 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
21160 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
21170 45 44 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ED && !MEMDB );.
21180 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
21190 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
211a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
211b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
211c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
211d0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
211e0 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65 74 20  ;.  }.  iOffset 
211f0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
21200 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21210 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
21220 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
21230 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
21240 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
21250 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28   iOffset);.  if(
21260 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
21270 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
21280 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
21290 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d 65 6d  ta)[24];.    mem
212a0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
212b0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
212c0 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  ers, sizeof(pPag
212d0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
212e0 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  ;.  }.  CODEC1(p
212f0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
21300 61 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 0a 20 20  a, pgno, 3);..  
21310 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
21320 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
21330 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
21340 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
21350 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
21360 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
21370 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
21380 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
21390 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
213a0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
213c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
213d0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
213e0 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
213f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21400 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
21410 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
21420 76 65 72 20 74 68 65 20 75 70 70 65 72 20 6c 61  ver the upper la
21430 79 65 72 20 72 65 71 75 65 73 74 73 20 61 20 64  yer requests a d
21440 61 74 61 62 61 73 65 0a 2a 2a 20 70 61 67 65 20  atabase.** page 
21450 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 62 65  is requested, be
21460 66 6f 72 65 20 74 68 65 20 63 61 63 68 65 20 69  fore the cache i
21470 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
21480 73 75 69 74 61 62 6c 65 20 70 61 67 65 0a 2a 2a  suitable page.**
21490 20 6f 72 20 61 6e 79 20 64 61 74 61 20 69 73 20   or any data is 
214a0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
214b0 74 61 62 61 73 65 2e 20 49 74 20 70 65 72 66 6f  tabase. It perfo
214c0 72 6d 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rms the followin
214d0 67 0a 2a 2a 20 74 77 6f 20 66 75 6e 63 74 69 6f  g.** two functio
214e0 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  ns:.**.**   1) I
214f0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
21500 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45  urrently in PAGE
21510 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28  R_UNLOCK state (
21520 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
21530 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
21540 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
21550 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
21560 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
21570 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
21580 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
21590 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
215a0 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
215b0 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
215c0 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
215d0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
215e0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
215f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
21600 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
21610 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
21620 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
21630 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
21640 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
21650 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
21660 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
21670 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
21680 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
21690 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
216a0 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
216b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
216c0 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
216d0 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
216e0 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
216f0 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
21700 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
21710 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
21720 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
21730 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
21740 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
21750 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
21760 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
21770 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
21780 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
21790 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
217a0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
217b0 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
217c0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
217d0 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
217e0 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
217f0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
21800 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
21810 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
21820 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
21830 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
21840 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72   operation descr
21850 69 62 65 64 20 62 79 20 28 32 29 20 61 62 6f 76  ibed by (2) abov
21860 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  e is not attempt
21870 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a  ed, and if the.*
21880 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  * pager is in an
21890 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
218a0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
218b0 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73  ULL when this is
218c0 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20   called,.** the 
218d0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
218e0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
218f0 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74  ed. It is permit
21900 74 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a  ted to read the.
21910 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68 65 6e  ** database when
21920 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   in SQLITE_FULL 
21930 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
21940 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
21950 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
21960 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
21970 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21980 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72  . If an.** IO er
21990 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
219a0 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
219b0 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
219c0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
219d0 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c  l.** file or rol
219e0 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
219f0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
21a00 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
21a10 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
21a20 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72  ic int pagerShar
21a30 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
21a40 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
21a50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
21a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21a70 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
21a80 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65 74  int isErrorReset
21a90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21aa0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
21ab0 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72  covering from er
21ac0 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20  ror state */..  
21ad0 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
21ae0 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f  ase is opened fo
21af0 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
21b00 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  ss, has no outst
21b10 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67  anding .  ** pag
21b20 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
21b30 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d   is in an error-
21b40 73 74 61 74 65 2c 20 74 68 69 73 20 69 73 20 61  state, this is a
21b50 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72   chance to clear
21b60 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  .  ** the error.
21b70 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
21b80 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
21b90 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65  er-cache and tre
21ba0 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e  at any.  ** open
21bb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73   journal file as
21bc0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a   a hot-journal..
21bd0 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44    */.  if( !MEMD
21be0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63  B && pPager->exc
21bf0 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26  lusiveMode .   &
21c00 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
21c10 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
21c20 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20 70  pPCache)==0 && p
21c30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 0a  Pager->errCode .
21c40 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f    ){.    if( isO
21c50 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
21c60 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f   ){.      isErro
21c70 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20  rReset = 1;.    
21c80 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  }.    pPager->er
21c90 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
21ca0 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  K;.    pager_res
21cb0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
21cc0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
21cd0 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61  er is still in a
21ce0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  n error state, d
21cf0 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54  o not proceed. T
21d00 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73  he error .  ** s
21d10 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65  tate will be cle
21d20 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69  ared at some poi
21d30 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
21d40 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a   when all page .
21d50 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
21d60 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20  are dropped and 
21d70 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62 65  the cache can be
21d80 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f   discarded..  */
21d90 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
21da0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
21db0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
21dc0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
21dd0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
21de0 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Code;.  }..  if(
21df0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
21e00 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20  PAGER_UNLOCK || 
21e10 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
21e20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
21e30 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
21e40 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
21e50 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61   int isHotJourna
21e60 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
21e70 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
21e80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21e90 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
21ea0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
21eb0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  =0 );.    if( !p
21ec0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
21ed0 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  k ){.      rc = 
21ee0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
21ef0 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
21f00 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
21f10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21f20 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
21f30 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
21f40 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
21f50 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
21f60 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
21f70 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
21f80 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
21f90 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
21fa0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
21fb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
21fc0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
21fd0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ED;.    }.    as
21fe0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
21ff0 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
22000 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
22010 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
22020 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
22030 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
22040 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
22050 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
22060 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
22070 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
22080 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
22090 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
220a0 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74  f( !isErrorReset
220b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68   ){.      rc = h
220c0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
220d0 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e  ger, &isHotJourn
220e0 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
220f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22100 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
22110 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
22120 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72 72   }.    if( isErr
22130 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74  orReset || isHot
22140 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
22150 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
22160 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
22170 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22180 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
22190 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   is.      ** imp
221a0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
221b0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
221c0 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
221d0 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
221e0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
221f0 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
22200 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
22210 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
22220 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
22230 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
22240 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
22250 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
22260 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
22270 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
22280 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
22290 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
222a0 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
222b0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f  the .      ** ho
222c0 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a  t-journal back..
222d0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
222e0 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
222f0 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
22300 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
22310 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a   requested, any.
22320 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70        ** other p
22330 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e  rocess attemptin
22340 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  g to access the 
22350 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
22360 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20  ll get to .     
22370 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69   ** this point i
22380 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
22390 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  ail to obtain it
223a0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
223b0 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f  lock .      ** o
223c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
223d0 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ile..      */.  
223e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
223f0 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f  state<EXCLUSIVE_
22400 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
22410 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
22420 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  ck(pPager->fd, E
22430 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
22440 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
22450 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22460 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
22470 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
22480 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  rc);.          g
22490 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
224a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
224b0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
224c0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
224d0 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
224e0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
224f0 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
22500 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69  e access. This i
22510 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20  s because in .  
22520 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
22530 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
22540 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
22550 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
22560 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  en and.      ** 
22570 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
22580 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
22590 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
225a0 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
225b0 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61       ** OsTrunca
225c0 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69  te() call used i
225d0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
225e0 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71  ss mode also req
225f0 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  uires.      ** a
22600 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65   read/write file
22610 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a   handle..      *
22620 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
22630 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
22640 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
22650 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  res;.        rc 
22660 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
22670 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a  s(pVfs,pPager->z
22680 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41  Journal,SQLITE_A
22690 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65  CCESS_EXISTS,&re
226a0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
226b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
226c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
226d0 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
226e0 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
226f0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
22700 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
22710 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
22720 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
22730 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
22740 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
22750 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
22760 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
22770 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
22780 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
22790 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
227a0 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
227b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
227c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
227d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
227e0 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
227f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22800 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
22810 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
22820 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
22830 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22840 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20  CANTOPEN;.      
22850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
22860 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
22870 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
22880 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
22890 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
228a0 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
228b0 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
228c0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f 6d  , that means som
228d0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
228e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68              ** h
228f0 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c 65  as already rolle
22900 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20 20  d it back */.   
22910 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
22920 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
22930 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22950 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22960 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
22970 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
22980 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  ..      /* TODO:
22990 20 57 68 79 20 61 72 65 20 74 68 65 73 65 20 63   Why are these c
229a0 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49 73 20  leared here? Is 
229b0 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20 2a 2f  it necessary? */
229c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
229d0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
229e0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
229f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
22a00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
22a10 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
22a20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
22a30 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
22a40 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
22a50 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
22a60 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
22a70 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
22a80 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
22a90 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
22aa0 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
22ab0 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
22ac0 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
22ad0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
22ae0 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
22af0 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
22b00 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
22b10 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
22b20 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ache..      */. 
22b30 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
22b40 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
22b50 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
22b60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22b70 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
22b80 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
22b90 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
22ba0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
22bb0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
22bc0 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d   (pPager->state=
22bd0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  =PAGER_SHARED). 
22be0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
22bf0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
22c00 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
22c10 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
22c20 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  D).      );.    
22c30 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  }..    if( sqlit
22c40 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
22c50 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
22c60 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)>0 ){.      /*
22c70 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
22c80 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
22c90 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
22ca0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
22cb0 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
22cc0 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
22cd0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
22ce0 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
22cf0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
22d00 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
22d10 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
22d20 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
22d30 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
22d40 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
22d50 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
22d60 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
22d70 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
22d80 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
22d90 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
22da0 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
22db0 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
22dc0 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
22dd0 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
22de0 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
22df0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
22e00 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
22e10 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
22e20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
22e30 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
22e40 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
22e50 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
22e60 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
22e70 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
22e80 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
22e90 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
22ea0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
22eb0 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
22ec0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
22ed0 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
22ee0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
22ef0 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
22f00 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
22f10 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
22f20 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
22f30 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
22f40 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
22f50 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
22f60 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
22f70 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
22f80 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
22f90 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
22fa0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
22fb0 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  )];.      sqlite
22fc0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
22fd0 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20 20  pPager, 0);..   
22fe0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
22ff0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
23000 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
23010 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  rrCode;.        
23020 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
23030 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
23040 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
23050 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20  zeValid );.     
23060 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
23070 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
23080 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
23090 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
230a0 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
230b0 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
230c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
230d0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
230e0 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
230f0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
23100 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69  , 24);.        i
23110 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
23130 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
23140 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
23150 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
23160 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
23170 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
23180 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
23190 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
231a0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
231b0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
231c0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
231d0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
231e0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
231f0 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
23200 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
23210 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
23220 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
23230 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
23240 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66 61  ARED );.  }.. fa
23250 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
23260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23270 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   /* pager_unlock
23280 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
23290 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  r exclusive mode
232a0 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   and in-memory d
232b0 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20  atabases. */.   
232c0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
232d0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
232e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
232f0 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
23300 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
23310 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
23320 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
23330 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
23340 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
23350 72 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  r..*/ .static vo
23360 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
23370 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
23380 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73 71 6c  ager){.  if( sql
23390 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
233a0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
233b0 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61  he)==0 ){.    pa
233c0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
233d0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
233e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20  }.}../*.** Drop 
233f0 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
23400 63 61 63 68 65 20 75 73 69 6e 67 20 73 71 6c 69  cache using sqli
23410 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 29 2e  te3PcacheDrop().
23420 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d  .**.** If this m
23430 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 6e  eans there are n
23440 6f 77 20 6e 6f 20 70 61 67 65 73 20 77 69 74 68  ow no pages with
23450 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
23460 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  hem, a rollback.
23470 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ** occurs and th
23480 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
23490 74 61 62 61 73 65 20 69 73 20 72 65 6d 6f 76 65  tabase is remove
234a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
234b0 64 20 70 61 67 65 72 44 72 6f 70 50 61 67 65 28  d pagerDropPage(
234c0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
234d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
234e0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73  pPg->pPager;.  s
234f0 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
23500 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e  (pPg);.  pagerUn
23510 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
23520 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ger);.}../*.** A
23530 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
23540 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ce to page numbe
23550 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20  r pgno in pager 
23560 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a  pPager (a page.*
23570 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20  * reference has 
23580 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49  type DbPage*). I
23590 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
235a0 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
235b0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
235c0 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
235d0 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
235e0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
235f0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
23600 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
23610 73 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  s pagerSharedLoc
23620 6b 28 29 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  k() to obtain a 
23630 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 0a 2a  SHARED lock on.*
23640 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
23650 69 6c 65 20 69 66 20 73 75 63 68 20 61 20 6c 6f  ile if such a lo
23660 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 69 73  ck or greater is
23670 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c   not already hel
23680 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20 63  d..** This may c
23690 61 75 73 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ause hot-journal
236a0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 63   rollback or a c
236b0 61 63 68 65 20 70 75 72 67 65 2e 20 53 65 65 20  ache purge. See 
236c0 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 61 62 6f 76  comments.** abov
236d0 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65 72  e function pager
236e0 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66 6f 72  SharedLock() for
236f0 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20   details..**.** 
23700 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
23710 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
23720 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
23730 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
23740 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
23750 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
23760 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
23770 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
23780 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
23790 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
237a0 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
237b0 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
237c0 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
237d0 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
237e0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
237f0 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
23800 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
23810 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
23820 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
23830 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
23840 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
23850 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
23860 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
23870 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
23880 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
23890 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
238a0 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
238b0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
238c0 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
238d0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
238e0 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
238f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
23900 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
23910 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
23920 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
23930 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
23940 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
23950 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
23960 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
23970 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
23980 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
23990 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
239a0 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
239b0 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
239c0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
239d0 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
239e0 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
239f0 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
23a00 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
23a10 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
23a20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
23a30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
23a40 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
23a50 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
23a60 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
23a70 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
23a80 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
23a90 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
23aa0 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
23ab0 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
23ac0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
23ad0 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
23ae0 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70  ccurs in two sep
23af0 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a  erate scenarios:
23b00 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
23b10 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
23b20 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
23b30 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
23b40 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
23b50 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
23b60 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
23b70 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
23b80 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
23b90 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
23ba0 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
23bb0 70 6f 70 75 6c 61 74 65 20 77 69 74 68 20 74 68  populate with th
23bc0 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
23bd0 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
23be0 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
23bf0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
23c00 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
23c10 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
23c20 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
23c30 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
23c40 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
23c50 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
23c60 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
23c70 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
23c80 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
23c90 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
23ca0 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
23cb0 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
23cc0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
23cd0 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
23ce0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
23cf0 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
23d00 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
23d10 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
23d20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
23d30 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
23d40 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
23d50 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
23d60 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
23d70 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
23d80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
23d90 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
23da0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
23db0 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
23dc0 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
23dd0 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
23de0 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
23df0 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
23e00 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
23e10 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
23e20 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
23e30 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
23e40 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
23e50 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
23e60 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
23e70 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
23e80 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
23e90 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
23ea0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
23eb0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
23ec0 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
23ed0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
23ee0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
23ef0 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
23f00 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
23f10 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
23f20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
23f30 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
23f40 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
23f50 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
23f60 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
23f70 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
23f80 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
23f90 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
23fa0 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
23fb0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
23fc0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
23fd0 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
23fe0 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
23ff0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
24000 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
24010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
24020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
24030 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
24040 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
24050 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
24060 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
24070 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
24080 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
24090 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
240a0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
240b0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
240c0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
240d0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
240e0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
240f0 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
24100 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
24110 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
24120 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
24130 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  e */.){.  PgHdr 
24140 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20  *pPg = 0;.  int 
24150 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  rc;..  assert( a
24160 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
24170 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
24180 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
24190 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
241a0 43 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71  CK .       || sq
241b0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
241c0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
241d0 63 68 65 29 3e 30 20 0a 20 20 20 20 20 20 20 7c  che)>0 .       |
241e0 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b 0a 0a  | pgno==1.  );..
241f0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
24200 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
24210 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
24220 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
24230 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
24240 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
24250 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
24260 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
24270 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
24280 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
24290 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
242a0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
242b0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
242c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
242d0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
242e0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
242f0 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
24300 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
24310 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
24320 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
24330 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  *ppPage = 0;..  
24340 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
24350 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
24360 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
24370 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
24380 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
24390 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68  se file. pagerSh
243a0 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20  aredLock() is a 
243b0 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61  no-op if .  ** a
243c0 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69   database lock i
243d0 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a  s already held..
243e0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
243f0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67  rSharedLock(pPag
24400 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
24410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24420 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24430 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24440 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
24450 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20  LOCK );..  rc = 
24460 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
24470 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
24480 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26 70 50  he, pgno, 1, &pP
24490 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
244a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
244b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
244c0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
244d0 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
244e0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
244f0 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d  ==pPager || pPg-
24500 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 20 20  >pPager==0 );.  
24510 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  if( pPg->pPager=
24520 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
24530 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
24540 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
24550 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
24560 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
24570 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
24580 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
24590 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47 45 52   nMax;.    PAGER
245a0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
245b0 69 73 73 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  iss);.    pPg->p
245c0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
245d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
245e0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
245f0 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a  pPager, &nMax);.
24600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
24620 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
24630 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74  (pPg);.      ret
24640 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
24650 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74     if( nMax<(int
24660 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c  )pgno || MEMDB |
24670 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  | noContent ){. 
24680 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
24690 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
246a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
246b0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
246c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
246d0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
246e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
246f0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
24700 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
24710 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
24720 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
24730 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
24740 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
24750 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
24760 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
24770 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
24780 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
24790 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
247a0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
247b0 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
247c0 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
247d0 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
247e0 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
247f0 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
24800 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
24810 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
24820 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
24830 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
24840 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
24850 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
24860 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
24870 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
24880 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
24890 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
248a0 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
248b0 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
248c0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
248d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
248e0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
248f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
24900 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
24910 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24920 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
24930 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
24940 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
24950 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
24960 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
24970 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
24980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
24990 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
249a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
249b0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
249c0 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
249d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
249e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
249f0 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
24a00 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
24a10 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
24a20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24a30 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
24a40 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er );.      rc =
24a50 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
24a60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
24a70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
24a80 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
24a90 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
24aa0 20 20 20 20 70 61 67 65 72 44 72 6f 70 50 61 67      pagerDropPag
24ab0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
24ac0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
24ad0 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20   }.    }.#ifdef 
24ae0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
24af0 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
24b00 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
24b10 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
24b20 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
24b30 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
24b40 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
24b50 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
24b60 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
24b70 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 7d  ager->nHit);.  }
24b80 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  ..  *ppPage = pP
24b90 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
24ba0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
24bb0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
24bc0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
24bd0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
24be0 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
24bf0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
24c00 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
24c10 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24c20 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
24c30 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
24c40 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
24c50 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69  Also, return 0 i
24c60 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20  f the .** pager 
24c70 69 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  is in PAGER_UNLO
24c80 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  CK state when th
24c90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
24ca0 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20  alled,.** or if 
24cb0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
24cc0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f  an error state o
24cd0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
24ce0 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  _FULL..**.** See
24cf0 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
24d00 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
24d10 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
24d20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
24d30 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
24d40 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
24d50 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
24d60 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
24d70 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
24d80 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
24d90 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
24da0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
24db0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
24dc0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
24dd0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
24de0 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
24df0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
24e00 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
24e10 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
24e20 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
24e30 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
24e40 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
24e50 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65  *pPg = 0;.  asse
24e60 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
24e70 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
24e80 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 50  =0 );..  if( (pP
24e90 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
24ea0 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20 26 26  ER_UNLOCK).   &&
24eb0 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
24ec0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  e==SQLITE_OK || 
24ed0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
24ee0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 0a 20 20  =SQLITE_FULL).  
24ef0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
24f00 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
24f10 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
24f20 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 7d 0a 0a   0, &pPg);.  }..
24f30 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
24f40 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
24f50 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
24f60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
24f70 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
24f80 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
24f90 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
24fa0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
24fb0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
24fc0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
24fd0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
24fe0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
24ff0 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
25000 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
25010 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
25020 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
25030 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
25040 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
25050 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
25060 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
25070 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
25080 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
25090 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
250a0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
250b0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
250c0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
250d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
250e0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
250f0 66 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  file has already
25100 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e   been opened, en
25110 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a  sure that the.**
25120 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
25130 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49  e is open too. I
25140 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
25150 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a  al is not open,.
25160 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
25170 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
25180 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
25190 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72  returned if ever
251a0 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f  ything goes acco
251b0 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a  rding to plan. .
251c0 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45  ** An SQLITE_IOE
251d0 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
251e0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
251f0 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73   a call to .** s
25200 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66  qlite3OsOpen() f
25210 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
25220 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  int openSubJourn
25230 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
25240 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
25250 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
25260 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
25270 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
25280 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
25290 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
252a0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
252b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
252c0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71  MORY ){.      sq
252d0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
252e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
252f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25300 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
25310 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
25320 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
25330 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
25340 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
25350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25360 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
25370 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
25380 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
25390 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
253a0 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
253b0 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
253c0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
253d0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
253e0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
253f0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
25400 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
25410 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
25420 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
25430 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
25440 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
25450 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
25460 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
25470 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
25480 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
25490 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
254a0 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
254b0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
254c0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
254d0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
254e0 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
254f0 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
25500 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
25510 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
25520 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
25530 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
25540 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
25550 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
25560 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
25570 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25580 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
25590 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
255a0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
255b0 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
255c0 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
255d0 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
255e0 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
255f0 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
25600 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
25610 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
25620 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
25630 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
25640 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
25650 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
25660 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
25670 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
25680 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
25690 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
256a0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
256b0 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
256c0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
256d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
256e0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
256f0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
25700 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
25710 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
25720 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
25730 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
25740 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
25750 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
25760 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
25770 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
25780 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
25790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
257c0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
257d0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
257e0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
257f0 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
25800 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
25810 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
25820 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25830 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
25840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25850 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
25860 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25870 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
25880 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
25890 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
258a0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
258b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
258c0 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
258d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
258e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
258f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
25900 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20    }..  /* TODO: 
25910 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70 6f 73  Is it really pos
25920 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68 65 72  sible to get her
25930 65 20 77 69 74 68 20 64 62 53 69 7a 65 56 61 6c  e with dbSizeVal
25940 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a 20  id==0? If not,. 
25950 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   ** the call to 
25960 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29  PagerPagecount()
25970 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 2e   can be removed.
25980 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
25990 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
259a0 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73 71  Valid==0 );.  sq
259b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
259c0 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
259d0 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
259e0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
259f0 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
25a00 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69  er->dbSize);.  i
25a10 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
25a20 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
25a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
25a40 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  MEM;.  }..  /* O
25a50 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
25a60 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
25a70 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
25a80 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
25a90 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
25aa0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
25ab0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
25ac0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
25ad0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
25ae0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
25af0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
25b00 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
25b10 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
25b20 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
25b30 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
25b40 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
25b50 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
25b60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
25b70 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
25b80 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
25b90 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
25ba0 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28 70  EATE|.        (p
25bb0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
25bc0 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ? .          (SQ
25bd0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
25be0 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
25bf0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
25c00 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ):.          (SQ
25c10 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
25c20 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
25c30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
25c40 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
25c50 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20  RITE.      rc = 
25c60 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
25c70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 56  en(.          pV
25c80 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
25c90 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
25ca0 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
25cb0 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
25cc0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a  .      );.#else.
25cd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25ce0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
25cf0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
25d00 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
25d10 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ags, 0);.#endif.
25d20 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
25d30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25d40 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
25d50 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a  ->jfd) );.  }...
25d60 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
25d70 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
25d80 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
25d90 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
25da0 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a   .  ** the sub-j
25db0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
25dc0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
25dd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25de0 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68  .    /* TODO: Ch
25df0 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
25e00 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
25e10 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
25e20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
25e30 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
25e40 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ize;.    pPager-
25e50 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
25e60 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
25e70 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
25e80 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
25e90 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
25ea0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
25eb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74  .    pPager->set
25ec0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
25ed0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
25ee0 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  dr = 0;.    rc =
25ef0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
25f00 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
25f10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25f20 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  K && pPager->nSa
25f30 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72  vepoint ){.    r
25f40 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
25f50 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
25f60 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
25f70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
25f80 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
25f90 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
25fa0 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
25fb0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
25fc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
25fd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
25fe0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
25ff0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
26000 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
26010 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
26020 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
26030 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
26040 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
26050 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
26060 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
26070 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
26080 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
26090 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
260a0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
260b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
260c0 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
260d0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
260e0 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
260f0 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
26100 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
26110 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
26120 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
26130 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
26140 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
26150 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
26160 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
26170 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  y or in-memory f
26180 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75  ile and, the jou
26190 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a  rnal file is .**
261a0 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68 61   opened if it ha
261b0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61  s not been alrea
261c0 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72  dy. For a tempor
261d0 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70  ary file, the op
261e0 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65  ening .** of the
261f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
26200 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
26210 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75  there is an actu
26220 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77  al need to .** w
26230 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
26240 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68  nal. TODO: Why h
26250 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  andle temporary 
26260 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c  files differentl
26270 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y?.**.** If the 
26280 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
26290 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74  opened (or if it
262a0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
262b0 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75  ), then a.** jou
262c0 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77  rnal-header is w
262d0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
262e0 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2f 0a 69 6e  art of it..*/.in
262f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
26300 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
26310 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a  r, int exFlag){.
26320 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26330 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
26340 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
26350 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
26360 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
26370 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
26380 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
26390 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
263a0 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  al==0 );.    ass
263b0 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21  ert( !MEMDB && !
263c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
263d0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 62 74 61   );..    /* Obta
263e0 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
263f0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
26400 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
26410 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
26420 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c  .    ** is true,
26430 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
26440 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
26450 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
26460 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ock. The.    ** 
26470 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
26480 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65  lback can be use
26490 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  d when upgrading
264a0 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56   to the EXCLUSIV
264b0 45 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62  E.    ** lock, b
264c0 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
264d0 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
264e0 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ED lock..    */.
264f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26500 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
26510 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
26520 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
26530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26540 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
26550 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
26560 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78 46 6c  ;.      if( exFl
26570 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ag ){.        rc
26580 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
26590 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
265a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
265b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
265c0 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75    /* If the requ
265d0 69 72 65 64 20 6c 6f 63 6b 73 20 77 65 72 65 20  ired locks were 
265e0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
265f0 61 69 6e 65 64 2c 20 6f 70 65 6e 20 74 68 65 20  ained, open the 
26600 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
26610 69 6c 65 20 61 6e 64 20 77 72 69 74 65 20 74 68  ile and write th
26620 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  e first journal-
26630 68 65 61 64 65 72 20 74 6f 20 69 74 2e 0a 20 20  header to it..  
26640 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
26650 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
26660 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
26670 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
26680 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
26690 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
266a0 4f 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  OFF .    ){.    
266b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
266c0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
266d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
266e0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
266f0 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
26700 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
26710 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
26720 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
26730 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
26740 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
26750 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20  mode the last.  
26760 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
26770 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
26780 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
26790 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
267a0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
267b0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
267c0 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
267d0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
267e0 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
267f0 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
26800 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63  either was trunc
26810 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20  ated to 0 bytes 
26820 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61  or its header wa
26830 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69  s.    ** overwri
26840 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tten with zeros.
26850 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
26860 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  rt( pPager->nRec
26870 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
26880 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
26890 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  gSize==0 );.    
268a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
268b0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
268c0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
268d0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
268e0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  ger);.  }..  PAG
268f0 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
26900 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
26910 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
26920 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
26930 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
26940 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
26950 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51  lOff>0 || rc!=SQ
26960 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
26970 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26980 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
26990 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
269a0 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
269b0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
269c0 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
269d0 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
269e0 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
269f0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
26a00 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
26a10 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
26a20 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
26a30 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
26a40 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
26a50 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
26a60 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
26a70 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
26a80 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
26a90 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
26aa0 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
26ab0 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
26ac0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
26ad0 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
26ae0 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
26af0 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
26b00 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
26b10 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
26b20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26b30 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
26b40 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
26b50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
26b60 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
26b70 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
26b80 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
26b90 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
26ba0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26bb0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
26bc0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
26bd0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
26be0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
26bf0 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
26c00 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
26c10 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
26c20 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
26c30 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
26c40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
26c50 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
26c60 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
26c70 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
26c80 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
26c90 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e   if( pageInJourn
26ca0 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a  al(pPg) && !subj
26cb0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
26cc0 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
26cd0 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
26ce0 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
26cf0 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
26d00 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
26d10 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
26d20 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
26d30 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
26d40 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
26d50 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
26d60 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
26d70 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
26d80 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
26d90 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
26da0 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
26db0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
26dc0 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
26dd0 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
26de0 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
26df0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26e00 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
26e10 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
26e20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
26e30 67 69 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  gin(pPager, 0);.
26e40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26e50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
26e60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
26e70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26e80 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
26e90 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
26ea0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
26eb0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
26ec0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a  ger->useJournal.
26ed0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61            && pPa
26ee0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
26ef0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
26f00 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ODE_OFF ){.     
26f10 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
26f20 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
26f30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
26f40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
26f50 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
26f60 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
26f70 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  ied = 1;.  .    
26f80 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
26f90 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
26fa0 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
26fb0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
26fc0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
26fd0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26fe0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
26ff0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
27000 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
27010 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
27020 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
27030 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
27040 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
27050 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
27060 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
27070 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27080 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
27090 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67   pPg->pgno<=pPag
270a0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
270b0 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
270c0 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
270d0 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20  r *pData2;..    
270e0 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
270f0 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
27100 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27110 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
27120 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
27130 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
27140 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
27150 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
27160 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  ifies.        **
27170 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
27180 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
27190 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
271a0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
271b0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ger) );.        
271c0 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
271d0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
271e0 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
271f0 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
27200 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
27210 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
27220 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
27230 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
27240 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
27250 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70  urnalOff, pPg->p
27260 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
27270 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
27290 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
272a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
272b0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
272c0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
272d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
272f0 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20  urnalOff + 4);. 
27300 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
27310 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
27320 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
27330 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
27340 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27360 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
27370 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
27380 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
27390 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  lOff, cksum);.  
273a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
273b0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
273c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
273d0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55     IOTRACE(("JOU
273e0 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
273f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
27400 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
27410 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
27420 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61  >journalOff, pPa
27430 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b  ger->pageSize));
27440 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49  .        PAGER_I
27450 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
27460 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
27470 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
27480 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
27490 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
274a0 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
274b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
274c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
274d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
274e0 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
274f0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
27500 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70  ED_SYNC)?1:0), p
27510 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
27520 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  g)));..        /
27530 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
27540 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
27550 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  r occurred while
27560 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65   journalling the
27570 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
27580 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
27590 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
275a0 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
275b0 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20  the page..      
275c0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
275d0 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
275e0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
275f0 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
27600 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61  n.        ** pla
27610 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
27620 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74   will think that
27630 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
27640 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20  to be restored. 
27650 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
27660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
27670 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72  And if an IO err
27680 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
27690 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20  doing so,.      
276a0 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70    ** then corrup
276b0 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e  tion may follow.
276c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
276d0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
276e0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
276f0 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
27700 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
27710 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  NC;.          pP
27720 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
27730 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   1;.        }.. 
27740 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72         /* An err
27750 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
27760 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
27770 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
27780 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
27790 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
277a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74  rolled back by t
277b0 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a  he layer above..
277c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
277d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
277e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
277f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
27800 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
27810 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
27820 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27830 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
27840 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
27850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
27860 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
27870 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
27880 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
27890 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
278a0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
278b0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
278c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
278d0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
278e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
278f0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
27900 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
27910 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
27920 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27930 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27940 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
27950 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
27960 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
27970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27990 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
279a0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
279b0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
279c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
279d0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
279e0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
279f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
27a00 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
27a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
27a20 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e  GERTRACE(("APPEN
27a30 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
27a40 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
27a60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
27a70 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
27a80 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
27a90 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
27aa0 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
27ab0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
27ac0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
27ad0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
27ae0 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
27af0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
27b00 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
27b10 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
27b20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
27b30 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
27b40 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
27b50 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
27b60 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
27b70 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
27b80 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
27b90 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
27ba0 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
27bb0 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
27bc0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
27bd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
27be0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
27bf0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
27c00 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
27c10 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
27c20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
27c30 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
27c40 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
27c50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27c60 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
27c70 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
27c80 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67  ager->dbSize<pPg
27c90 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
27ca0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
27cb0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20  Pg->pgno;.  }.  
27cc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27cd0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
27ce0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
27cf0 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
27d00 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
27d10 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67  efore .** making
27d20 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
27d30 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ge. The caller m
27d40 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
27d50 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f  turn value .** o
27d60 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
27d70 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
27d80 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79  ot to change any
27d90 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73   page data unles
27da0 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  s .** this routi
27db0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
27dc0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
27dd0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
27de0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27df0 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
27e00 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
27e10 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
27e20 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
27e30 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
27e40 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
27e50 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
27e60 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
27e70 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
27e80 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
27e90 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
27ea0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
27eb0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
27ec0 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
27ed0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
27ee0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
27ef0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
27f00 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
27f10 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
27f20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
27f30 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
27f40 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
27f50 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
27f60 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
27f70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27f80 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
27f90 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
27fa0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
27fb0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
27fc0 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
27fd0 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
27fe0 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
27ff0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
28000 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63   if( nPagePerSec
28010 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
28020 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
28030 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
28040 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
28050 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
28060 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
28070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28080 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
28090 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
280a0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
280b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
280c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
280d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
280e0 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
280f0 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
28100 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28120 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
28130 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
28140 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
28150 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
28160 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f   page has PGHDR_
28170 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20  NEED_SYNC */..  
28180 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
28190 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31  otSync flag to 1
281a0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
281b0 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
281c0 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  w a journal.    
281d0 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  ** header to be 
281e0 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
281f0 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
28200 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  led by this func
28210 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
28220 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
28230 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
28240 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
28250 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
28260 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31  r->doNotSync = 1
28270 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
28280 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
28290 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
282a0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
282b0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
282c0 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
282d0 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
282e0 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
282f0 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
28300 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
28310 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
28320 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
28330 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
28340 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
28350 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
28360 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
28370 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   1;..    sqlite3
28380 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
28390 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e  Pager, (int *)&n
283a0 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20  PageCount);.    
283b0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
283c0 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
283d0 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
283e0 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
283f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
28400 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
28410 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
28420 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
28430 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
28440 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28450 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
28460 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
28470 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
28480 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
28490 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
284a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
284b0 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
284c0 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
284d0 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
284e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
284f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
28500 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
28510 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
28520 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d  ;.      if( pg==
28530 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71  pPg->pgno || !sq
28540 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
28550 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
28560 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20  al, pg) ){.     
28570 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
28580 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
28590 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
285a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
285b0 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
285c0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
285d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
285e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
285f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
28600 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
28610 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
28620 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
28630 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
28640 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
28650 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
28660 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
28670 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
28680 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28690 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
286a0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
286b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
286c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
286d0 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
286e0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
286f0 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
28700 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
28710 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
28720 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
28730 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
28740 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
28750 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28760 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
28770 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28780 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
28790 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
287a0 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
287b0 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65  any of the nPage
287c0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
287d0 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20  tarting at pg1, 
287e0 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f  then it needs to
287f0 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20   be set for all 
28800 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65  of them. Because
28810 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20  .    ** writing 
28820 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  to any of these 
28830 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20  nPage pages may 
28840 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72  damage the other
28850 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  s, the.    ** jo
28860 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
28870 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64  contain sync()ed
28880 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f   copies of all o
28890 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65  f them.    ** be
288a0 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d  fore any of them
288b0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
288c0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
288d0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
288e0 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
288f0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
28900 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  t( !MEMDB && pPa
28910 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29  ger->noSync==0 )
28920 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
28930 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65  ; ii<nPage && ne
28940 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  edSync; ii++){. 
28950 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
28960 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
28970 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
28980 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
28990 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
289a0 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20     pPage->flags 
289b0 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
289c0 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  NC;.          sq
289d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
289e0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
289f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
28a00 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
28a10 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
28a20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28a30 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
28a40 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
28a50 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
28a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
28a70 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
28a80 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
28a90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28aa0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
28ab0 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
28ac0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
28ad0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
28ae0 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
28af0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
28b00 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
28b10 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
28b20 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
28b30 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
28b40 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
28b50 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
28b60 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
28b70 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
28b80 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
28b90 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
28ba0 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
28bb0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
28bc0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
28bd0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
28be0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
28bf0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
28c00 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
28c10 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
28c20 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
28c30 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
28c40 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
28c50 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
28c60 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20  as dirty.  This 
28c70 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
28c80 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  mple, when.** th
28c90 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
28ca0 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20  added as a leaf 
28cb0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
28cc0 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f  and so its.** co
28cd0 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  ntent no longer 
28ce0 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  matters..**.** T
28cf0 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
28d00 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
28d10 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
28d20 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
28d30 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
28d40 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
28d50 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61  ed. The pager ma
28d60 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
28d70 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
28d80 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
28d90 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
28da0 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
28db0 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
28dc0 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75  imization can qu
28dd0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
28de0 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44  d of large .** D
28df0 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
28e00 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
28e10 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
28e20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
28e30 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
28e40 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
28e50 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
28e60 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50  HDR_DIRTY) && pP
28e70 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
28e80 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52  ==0 ){.    PAGER
28e90 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49  TRACE(("DONT_WRI
28ea0 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
28eb0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
28ec0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
28ed0 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
28ee0 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
28ef0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
28f00 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c  no)).    pPg->fl
28f10 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e  ags |= PGHDR_DON
28f20 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20  T_WRITE;.#ifdef 
28f30 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
28f40 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
28f50 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
28f60 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
28f70 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
28f80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
28f90 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
28fa0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ent the value of
28fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28fc0 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f  le .** change-co
28fd0 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73  unter, stored as
28fe0 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 4-byte big-en
28ff0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61  dian integer sta
29000 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74  rting at .** byt
29010 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74  e offset 24 of t
29020 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
29030 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69  *.** If the isDi
29040 72 65 63 74 20 66 6c 61 67 20 69 73 20 7a 65 72  rect flag is zer
29050 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
29060 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
29070 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
29080 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
29090 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
290a0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
290b0 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
290c0 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
290d0 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
290e0 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
290f0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
29100 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
29110 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
29120 65 20 69 73 44 69 72 65 63 74 20 66 6c 61 67 20  e isDirect flag 
29130 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d  may only be non-
29140 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72  zero if the libr
29150 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ary was compiled
29160 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c  .** with the SQL
29170 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
29180 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65  C_WRITE macro de
29190 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  fined. In this c
291a0 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72  ase,.** if isDir
291b0 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ect is non-zero,
291c0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
291d0 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74  se file is updat
291e0 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62  ed directly.** b
291f0 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64  y writing an upd
29200 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
29210 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63  page 1 using a c
29220 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73  all to the .** s
29230 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20  qlite3OsWrite() 
29240 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
29250 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
29260 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
29270 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
29280 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65  int isDirectMode
29290 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
292a0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44  LITE_OK;..  /* D
292b0 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69  eclare and initi
292c0 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69  alize constant i
292d0 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74  nteger 'isDirect
292e0 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61  '. If the.  ** a
292f0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
29300 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62  mization is enab
29310 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  led in this buil
29320 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74  d, then isDirect
29330 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c  .  ** is initial
29340 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75  ized to the valu
29350 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
29360 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72  isDirectMode par
29370 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74  ameter.  ** to t
29380 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74  his function. Ot
29390 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61  herwise, it is a
293a0 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72  lways set to zer
293b0 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
293c0 20 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66   idea is that if
293d0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
293e0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
293f0 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c  s not.  ** enabl
29400 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
29410 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  me, the compiler
29420 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65   can omit the te
29430 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44  sts of.  ** 'isD
29440 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73  irect' below, as
29450 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f   well as the blo
29460 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74  ck enclosed in t
29470 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44  he.  ** "if( isD
29480 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69  irect )" conditi
29490 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  on..  */.#ifndef
294a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
294b0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 63 6f  TOMIC_WRITE.  co
294c0 6e 73 74 20 69 6e 74 20 69 73 44 69 72 65 63 74  nst int isDirect
294d0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
294e0 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20  isDirectMode==0 
294f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
29500 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f  METER(isDirectMo
29510 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  de);.#else.  con
29520 73 74 20 69 6e 74 20 69 73 44 69 72 65 63 74 20  st int isDirect 
29530 3d 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3b 0a  = isDirectMode;.
29540 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
29550 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
29560 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
29570 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
29580 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
29590 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  e && pPager->dbS
295a0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  ize>0 ){.    PgH
295b0 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20  dr *pPgHdr;     
295c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
295d0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
295e0 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61  1 */.    u32 cha
295f0 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20  nge_counter;    
29600 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
29610 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67  l value of chang
29620 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
29630 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
29640 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
29650 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
29660 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20  er->fd) );..    
29670 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
29680 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
29690 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
296a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
296b0 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
296c0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73  pPgHdr);.    ass
296d0 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c  ert( pPgHdr==0 |
296e0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
296f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61  );..    /* If pa
29700 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68  ge one was fetch
29710 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
29720 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
29730 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  on is not.    **
29740 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69   operating in di
29750 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20  rect-mode, make 
29760 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e  page 1 writable.
29770 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29790 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
297a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
297b0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
297c0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
297d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
297e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63   ){.      /* Inc
297f0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
29800 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
29810 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
29820 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20  byte 24. */.    
29830 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
29840 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
29850 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e  te((u8*)pPager->
29860 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20  dbFileVers);.   
29870 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
29880 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32  r++;.      put32
29890 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
298a0 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  Hdr->pData)+24, 
298b0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
298c0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75  ..      /* If ru
298d0 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20  nning in direct 
298e0 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20  mode, write the 
298f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65  contents of page
29900 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   1 to the file. 
29910 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44  */.      if( isD
29920 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  irect ){.       
29930 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75   const void *zBu
29940 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74  f = pPgHdr->pDat
29950 61 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  a;.        asser
29960 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  t( pPager->dbFil
29970 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20  eSize>0 );.     
29980 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29990 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
299a0 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
299b0 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
299c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
299d0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   If everything w
299e0 6f 72 6b 65 64 2c 20 73 65 74 20 74 68 65 20 63  orked, set the c
299f0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
29a00 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  lag. */.      if
29a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29a20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
29a30 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
29a40 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
29a50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
29a60 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
29a70 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
29a80 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
29a90 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
29aa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29ab0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70  /*.** Sync the p
29ac0 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73  ager file to dis
29ad0 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  k. This is a no-
29ae0 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  op for in-memory
29af0 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67   files.** or pag
29b00 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65  es with the Page
29b10 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65  r.noSync flag se
29b20 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  t..**.** If succ
29b30 65 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65  essful, or calle
29b40 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72  d on a pager for
29b50 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e   which it is a n
29b60 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75  o-op, this.** fu
29b70 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
29b80 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
29b90 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  ise, an IO error
29ba0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
29bb0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
29bc0 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72  3PagerSync(Pager
29bd0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
29be0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c00 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
29c10 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
29c20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
29c30 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  c ){.    rc = SQ
29c40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
29c50 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
29c60 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
29c70 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
29c80 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
29c90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29ca0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
29cb0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
29cc0 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
29cd0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
29ce0 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
29cf0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
29d00 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
29d10 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
29d20 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
29d30 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
29d40 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
29d50 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
29d60 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
29d70 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
29d80 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
29d90 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
29da0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
29db0 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
29dc0 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s that:.**.**   
29dd0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
29de0 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
29df0 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  er is updated,.*
29e00 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61  *   * the journa
29e10 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c  l is synced (unl
29e20 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ess the atomic-w
29e30 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
29e40 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20  n is used),.**  
29e50 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67   * all dirty pag
29e60 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  es are written t
29e70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29e80 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65  ile, .**   * the
29e90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
29ea0 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20  s truncated (if 
29eb0 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a  required), and.*
29ec0 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
29ed0 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
29ee0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
29ef0 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69  thing that remai
29f00 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
29f10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
29f20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20  to finalize .** 
29f30 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
29f40 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69  e or zero the fi
29f50 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65  rst part of) the
29f60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
29f70 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  r .** delete the
29f80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
29f90 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
29fa0 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
29fb0 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
29fc0 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
29fd0 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
29fe0 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
29ff0 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
2a000 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
2a010 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
2a020 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2a030 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
2a040 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
2a050 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
2a060 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
2a070 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
2a080 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
2a090 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
2a0a0 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
2a0b0 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
2a0c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a0d0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
2a0e0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
2a0f0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
2a100 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
2a110 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
2a120 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2a130 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
2a140 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
2a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a160 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
2a170 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
2a180 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20  r *zMaster,     
2a190 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
2a1a0 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65   NULL, the maste
2a1b0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
2a1c0 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20  /.  int noSync  
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1e0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
2a1f0 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e  mit the xSync on
2a200 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
2a210 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2a220 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2a230 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2a240 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  ode */..  if( pP
2a250 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
2a260 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
2a270 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
2a280 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2a290 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
2a2a0 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
2a2b0 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20  %s nSize=%d\n", 
2a2c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
2a2d0 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
2a2e0 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
2a2f0 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
2a300 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2a310 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
2a320 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
2a330 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
2a340 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
2a350 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2a360 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
2a370 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
2a380 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  ( MEMDB && pPage
2a390 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b  r->dbModified ){
2a3a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b  .    sqlite3Back
2a3b0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
2a3c0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65  ->pBackup);.  }e
2a3d0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
2a3e0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
2a3f0 43 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64  CED && pPager->d
2a400 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20 20  bModified ){..  
2a410 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2a420 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  ng block updates
2a430 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2a440 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ter. Exactly how
2a450 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
2a460 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20  this depends on 
2a470 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
2a480 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65  he atomic-update
2a490 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
2a4a0 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64    ** was enabled
2a4b0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
2a4c0 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72  , and if this tr
2a4d0 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20  ansaction meets 
2a4e0 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74  the .    ** runt
2a4f0 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20  ime criteria to 
2a500 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f  use the operatio
2a510 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n: .    **.    *
2a520 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d  *    * The file-
2a530 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
2a540 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2a550 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20   property for.  
2a560 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73    **      blocks
2a570 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69   of size page-si
2a580 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20  ze, and .    ** 
2a590 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74     * This commit
2a5a0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
2a5b0 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
2a5c0 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
2a5d0 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c    **    * Exactl
2a5e0 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
2a5f0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
2a600 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
2a610 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
2a620 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
2a630 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61   optimization wa
2a640 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74  s not enabled at
2a650 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
2a660 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  hen the.    ** p
2a670 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2a680 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69  counter() functi
2a690 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2a6a0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
2a6b0 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72  e.    ** counter
2a6c0 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f   in 'indirect-mo
2a6d0 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69  de'. If the opti
2a6e0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  mization is comp
2a6f0 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20  iled in but.    
2a700 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63  ** is not applic
2a710 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61  able to this tra
2a720 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73  nsaction, call s
2a730 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
2a740 61 74 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20  ate().    ** to 
2a750 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f  make sure the jo
2a760 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61  urnal file has a
2a770 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65  ctually been cre
2a780 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a  ated, then call.
2a790 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63      ** pager_inc
2a7a0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2a7b0 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
2a7c0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
2a7d0 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 2a  n indirect.    *
2a7e0 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a  * mode. .    **.
2a7f0 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
2a800 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  , if the optimiz
2a810 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e  ation is both en
2a820 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63  abled and applic
2a830 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  able,.    ** the
2a840 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63  n call pager_inc
2a850 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2a860 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
2a870 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20  change-counter. 
2a880 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74     ** in 'direct
2a890 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  ' mode. In this 
2a8a0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
2a8b0 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72   file will never
2a8c0 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74   be.    ** creat
2a8d0 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e  ed for this tran
2a8e0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  saction..    */.
2a8f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2a900 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2a910 45 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  E.    PgHdr *pPg
2a920 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2a930 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2a940 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) || pPager->jou
2a950 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2a960 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2a970 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
2a980 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ter && isOpen(pP
2a990 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
2a9a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2a9b0 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66  nalOff==jrnlBuff
2a9c0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a  erSize(pPager) .
2a9d0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2a9e0 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e  dbSize>=pPager->
2a9f0 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20  dbFileSize.     
2aa00 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71  && (0==(pPg = sq
2aa10 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
2aa20 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
2aa30 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67  ache)) || 0==pPg
2aa40 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29 7b  ->pDirty).    ){
2aa50 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
2aa60 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61   the db file cha
2aa70 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20  nge counter via 
2aa80 74 68 65 20 64 69 72 65 63 74 2d 77 72 69 74 65  the direct-write
2aa90 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20   method. The .  
2aaa0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
2aab0 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
2aac0 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  y the in-memory 
2aad0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2aae0 66 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  f page 1 .      
2aaf0 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ** to include th
2ab00 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65  e updated change
2ab10 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
2ab20 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a  n write page 1 .
2ab30 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
2ab40 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
2ab50 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  e file. Because 
2ab60 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
2ab70 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 70 72  ite .      ** pr
2ab80 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f  operty of the ho
2ab90 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  st file-system, 
2aba0 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
2abb0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2abc0 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
2abd0 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
2abe0 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r, 1);.    }else
2abf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2ac00 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
2ac10 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2ac20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2ac30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ac40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2ac50 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2ac60 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2ac70 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65     }.    }.#else
2ac80 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2ac90 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2aca0 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 23  er(pPager, 0);.#
2acb0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
2acc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2acd0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2ace0 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  one_exit;..    /
2acf0 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
2ad00 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
2ad10 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
2ad20 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
2ad30 67 65 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67  ges.    ** being
2ad40 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
2ad50 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
2ad60 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
2ad70 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
2ad80 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61  ** file. This ca
2ad90 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e  n only happen in
2ada0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
2adb0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2adc0 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20   Before reading 
2add0 74 68 65 20 70 61 67 65 73 20 77 69 74 68 20 70  the pages with p
2ade0 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67  age numbers larg
2adf0 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20  er than the .   
2ae00 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75   ** current valu
2ae10 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
2ae20 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62 61  e, set dbSize ba
2ae30 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ck to the value.
2ae40 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74      ** that it t
2ae50 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61 72 74  ook at the start
2ae60 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
2ae70 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
2ae80 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  the.    ** calls
2ae90 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2aea0 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72  Get() return zer
2aeb0 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61  oed pages instea
2aec0 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65 61  d of .    ** rea
2aed0 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74  ding data from t
2aee0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2aef0 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
2af00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2af10 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2af20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
2af30 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2af40 65 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72  e.     && pPager
2af50 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2af60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2af70 5f 4f 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20  _OFF .    ){.   
2af80 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20     Pgno i;      
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2afb0 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2afc0 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
2afd0 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41   Pgno iSkip = PA
2afe0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
2aff0 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20  er); /* Pending 
2b000 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20  lock page */.   
2b010 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62     const Pgno db
2b020 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2b030 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  bSize;       /* 
2b040 44 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 73  Database image s
2b050 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50  ize */ .      pP
2b060 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
2b070 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2b080 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d  e;.      for( i=
2b090 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61  dbSize+1; i<=pPa
2b0a0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
2b0b0 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
2b0c0 69 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76  if( !sqlite3Bitv
2b0d0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
2b0e0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26  InJournal, i) &&
2b0f0 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
2b100 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
2b110 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2b120 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72   /* Page to jour
2b130 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nal */.         
2b140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b150 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
2b160 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
2b170 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b180 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2b190 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2b1a0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  it;.          rc
2b1b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b1c0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
2b1d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2b1e0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
2b1f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2b200 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2b210 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2b220 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
2b230 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20     }.      } .  
2b240 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
2b250 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20  ze = dbSize;.   
2b260 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2b270 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
2b280 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
2b290 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2b2a0 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74   file. If a mast
2b2b0 65 72 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  er .    ** journ
2b2c0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
2b2d0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
2b2e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
2b2f0 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20  rnal file, .    
2b300 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72  ** or if zMaster
2b310 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73   is NULL (no mas
2b320 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68  ter journal), th
2b330 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  en this call is 
2b340 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
2b350 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
2b360 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
2b370 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
2b380 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b390 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2b3a0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2b3b0 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
2b3c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2b3d0 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75   If the atomic-u
2b3e0 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
2b3f0 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  on is being.    
2b400 2a 2a 20 75 73 65 64 2c 20 74 68 69 73 20 63 61  ** used, this ca
2b410 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61  ll will not crea
2b420 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
2b430 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61  ile or perform a
2b440 6e 79 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49  ny.    ** real I
2b450 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  O..    */.    rc
2b460 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2b470 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
2b480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2b490 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2b4a0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20  e_one_exit;..   
2b4b0 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
2b4c0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
2b4d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2b4e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
2b4f0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2b500 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69  (sqlite3PcacheDi
2b510 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2b520 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69  pPCache));.    i
2b530 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b540 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2b550 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
2b560 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  RR_BLOCKED );.  
2b570 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
2b580 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2b590 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2b5a0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
2b5b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2b5c0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2b5d0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
2b5e0 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69   not the same si
2b5f0 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ze as the databa
2b600 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a  se image,.    **
2b610 20 74 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f   then use pager_
2b620 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77  truncate to grow
2b630 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66   or shrink the f
2b640 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ile here..    */
2b650 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2b660 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  >dbSize!=pPager-
2b670 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
2b680 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d       Pgno nNew =
2b690 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2b6a0 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  - (pPager->dbSiz
2b6b0 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  e==PAGER_MJ_PGNO
2b6c0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
2b6d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2b6e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
2b6f0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20  CLUSIVE );.     
2b700 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
2b710 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65  cate(pPager, nNe
2b720 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  w);.      if( rc
2b730 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2b740 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2b750 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  one_exit;.    }.
2b760 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  .    /* Finally,
2b770 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
2b780 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
2b790 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
2b7a0 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29  ync && !noSync )
2b7b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2b7c0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
2b7d0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
2b7e0 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
2b7f0 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
2b800 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  DBSYNC %p\n", pP
2b810 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67  ager))..    pPag
2b820 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
2b830 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63  R_SYNCED;.  }..c
2b840 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2b850 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d  exit:.  if( rc==
2b860 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
2b870 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70  CKED ){.    /* p
2b880 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2b890 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74  counter() may at
2b8a0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
2b8b0 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20  an exclusive.   
2b8c0 20 2a 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c   ** lock to spil
2b8d0 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  l the cache and 
2b8e0 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f  return IOERR_BLO
2b8f0 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20  CKED. But since 
2b900 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73  .    ** there is
2b910 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63   no chance the c
2b920 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73  ache is inconsis
2b930 74 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20  tent, it is.    
2b940 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74  ** better to ret
2b950 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
2b960 0a 20 20 20 20 2a 2a 2f 0a 20 20 20 20 72 63 20  .    **/.    rc 
2b970 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
2b980 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2b990 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  }.../*.** When t
2b9a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b9b0 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61  called, the data
2b9c0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
2b9d0 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a  en completely.**
2b9e0 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c   updated to refl
2b9f0 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 20  ect the changes 
2ba00 6d 61 64 65 20 62 79 20 74 68 65 20 63 75 72 72  made by the curr
2ba10 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
2ba20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f  and.** synced to
2ba30 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e   disk. The journ
2ba40 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  al file still ex
2ba50 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2ba60 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75  -system .** thou
2ba70 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69  gh, and if a fai
2ba80 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74 20 74  lure occurs at t
2ba90 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c  his point it wil
2baa0 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  l eventually.** 
2bab0 62 65 20 75 73 65 64 20 61 73 20 61 20 68 6f 74  be used as a hot
2bac0 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65  -journal and the
2bad0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2bae0 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  tion rolled back
2baf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2bb00 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20  ction finalizes 
2bb10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2bb20 2c 20 65 69 74 68 65 72 20 62 79 20 64 65 6c 65  , either by dele
2bb30 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61  ting, .** trunca
2bb40 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c  ting or partiall
2bb50 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f  y zeroing it, so
2bb60 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20   that it cannot 
2bb70 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
2bb80 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
2bb90 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20  back. Once this 
2bba0 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e  is done the tran
2bbb0 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72  saction is.** ir
2bbc0 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74  revocably commit
2bbd0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
2bbe0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
2bbf0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2bc00 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2bc10 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76  the pager.** mov
2bc20 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  es into the erro
2bc30 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  r state. Otherwi
2bc40 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
2bc50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2bc60 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
2bc70 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67  mmitPhaseTwo(Pag
2bc80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2bc90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2bca0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2bcb0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2bcc0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e  de */..  /* Do n
2bcd0 6f 74 20 70 72 6f 63 65 65 64 20 69 66 20 74 68  ot proceed if th
2bce0 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
2bcf0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
2bd00 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
2bd10 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
2bd20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
2bd30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2bd40 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
2bd50 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
2bd60 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74  t be called if t
2bd70 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
2bd80 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a  in at least.  **
2bd90 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
2bda0 73 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65  state. And indee
2bdb0 64 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64  d SQLite never d
2bdc0 6f 65 73 20 74 68 69 73 2e 20 42 75 74 20 69 74  oes this. But it
2bdd0 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f   is.  ** nice to
2bde0 20 68 61 76 65 20 74 68 69 73 20 64 65 66 65 6e   have this defen
2bdf0 73 69 76 65 20 62 6c 6f 63 6b 20 68 65 72 65 20  sive block here 
2be00 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69  anyway..  */.  i
2be10 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2be20 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
2be30 45 52 56 45 44 29 20 29 7b 0a 20 20 20 20 72 65  ERVED) ){.    re
2be40 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2be50 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20  R;.  }..  /* An 
2be60 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66  optimization. If
2be70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
2be80 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
2be90 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20  odified during. 
2bea0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
2beb0 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20  tion, the pager 
2bec0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
2bed0 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64  clusive-mode and
2bee0 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70   is.  ** using p
2bef0 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
2bf00 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ls, then this fu
2bf10 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2bf20 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  p..  **.  ** The
2bf30 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
2bf40 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
2bf50 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  ntly contains a 
2bf60 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a  single journal .
2bf70 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68    ** header with
2bf80 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
2bf90 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63  set to 0. If suc
2bfa0 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75  h a journal is u
2bfb0 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f  sed as.  ** a ho
2bfc0 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67  t-journal during
2bfd0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2bfe0 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73  lback, 0 changes
2bff0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20   will be made.  
2c000 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
2c010 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72  se file. So ther
2c020 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
2c030 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  zero the journal
2c040 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53   .  ** header. S
2c050 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
2c060 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
2c070 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ode, there is no
2c080 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72   need.  ** to dr
2c090 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74  op any locks eit
2c0a0 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
2c0b0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2c0c0 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ed==0 && pPager-
2c0d0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
2c0e0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2c0f0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2c100 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
2c110 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73  SIST.  ){.    as
2c120 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
2c130 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
2c140 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
2c150 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
2c160 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2c170 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f   PAGERTRACE(("CO
2c180 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
2c190 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2c1a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c1b0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
2c1c0 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  NCED || MEMDB ||
2c1d0 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
2c1e0 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70  fied );.  rc = p
2c1f0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2c200 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2c210 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2c220 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2c230 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2c240 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
2c250 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
2c260 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
2c270 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
2c280 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
2c290 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2c2a0 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f  ion performs two
2c2b0 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   tasks:.**.**   
2c2c0 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b  1) It rolls back
2c2d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c2e0 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c  e, restoring all
2c2f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2c300 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d  nd .**      in-m
2c310 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
2c320 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  s to the state t
2c330 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e  hey were in when
2c340 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2c350 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65  .**      was ope
2c360 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29  ned, and.**   2)
2c370 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68   It finalizes th
2c380 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2c390 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  so that it is no
2c3a0 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a  t used for hot.*
2c3b0 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  *      rollback 
2c3c0 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20  at any point in 
2c3d0 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a  the future..**.*
2c3e0 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  * subject to the
2c3f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69   following quali
2c400 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  fications:.**.**
2c410 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
2c420 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65  l file is not ye
2c430 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  t open when this
2c440 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2c450 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f  led,.**   then o
2c460 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f  nly (2) is perfo
2c470 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rmed. In this ca
2c480 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a  se there is no j
2c490 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
2c4a0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a   to roll back..*
2c4b0 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20  *.** * If in an 
2c4c0 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
2c4d0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
2c4e0 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31  LL, then task (1
2c4f0 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f  ) is .**   perfo
2c500 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73  rmed. If success
2c510 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52  ful, task (2). R
2c520 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
2c530 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66   outcome.**   of
2c540 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72   either, the err
2c550 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
2c560 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2c570 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a  to the caller.**
2c580 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20     (i.e. either 
2c590 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
2c5a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
2c5b0 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20  .**.** * If the 
2c5c0 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
2c5d0 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
2c5e0 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
2c5f0 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20  1). Whether.**  
2c600 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73   or not (1) is s
2c610 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20  uccussful, also 
2c620 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20  attempt (2). If 
2c630 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
2c640 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f  rn.**   SQLITE_O
2c650 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e  K. Otherwise, en
2c660 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
2c670 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
2c680 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65  he first .**   e
2c690 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e  rror code encoun
2c6a0 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  tered. .**.**   
2c6b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2c6c0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
2c6d0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2c6e0 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  e was written to
2c6f0 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61  . .**   So is sa
2c700 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  fe to finalize t
2c710 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2c720 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79  even if the play
2c730 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72  back .**   (oper
2c740 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e  ation 1) failed.
2c750 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67   However the pag
2c760 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68  er must enter th
2c770 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a  e error state.**
2c780 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e     as the conten
2c790 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  ts of the in-mem
2c7a0 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f  ory cache are no
2c7b0 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a  w suspect..**.**
2c7c0 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69   * Finally, if i
2c7d0 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  n PAGER_EXCLUSIV
2c7e0 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  E state, then at
2c7f0 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a  tempt (1). Only.
2c800 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29  **   attempt (2)
2c810 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65   if (1) is succe
2c820 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51  ssful. Return SQ
2c830 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
2c840 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65  ssful,.**   othe
2c850 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20  rwise enter the 
2c860 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
2c870 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
2c880 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a   code from the .
2c890 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65  **   failing ope
2c8a0 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ration..**.**   
2c8b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2c8c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
2c8d0 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  ay have been wri
2c8e0 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74  tten to. So if t
2c8f0 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b  he.**   playback
2c900 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   operation did n
2c910 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f  ot succeed it wo
2c920 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20  uld not be safe 
2c930 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20  to finalize.**  
2c940 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c950 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  e. It needs to b
2c960 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
2c970 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61  le-system so tha
2c980 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65  t.**   some othe
2c990 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73  r process can us
2c9a0 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20  e it to restore 
2c9b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61  the database sta
2c9c0 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d  te (by.**   hot-
2c9d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
2c9e0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
2c9f0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
2ca00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2ca10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2ca20 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2ca30 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ca40 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54  code */.  PAGERT
2ca50 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE(("ROLLBACK 
2ca60 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2ca70 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
2ca80 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
2ca90 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ied || !isOpen(p
2caa0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2cab0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
2cac0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2cad0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
2cae0 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73  tMaster);.  }els
2caf0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72  e if( pPager->er
2cb00 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
2cb10 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2cb20 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
2cb30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2cb40 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2cb50 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
2cb60 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2cb70 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
2cb80 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
2cb90 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
2cba0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
2cbb0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
2cbc0 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ED ){.      int 
2cbd0 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc2;.      rc = 
2cbe0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
2cbf0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
2cc00 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64   rc2 = pager_end
2cc10 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2cc20 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2cc30 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
2cc40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cc50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2cc60 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
2cc70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2cc80 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
2cc90 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
2cca0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d     }..    if( !M
2ccb0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
2ccc0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2ccd0 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  d = 0;.    }..  
2cce0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2ccf0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
2cd00 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
2cd10 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
2cd20 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
2cd30 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
2cd40 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
2cd50 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
2cd60 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
2cd70 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74   .    ** persist
2cd80 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
2cd90 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
2cda0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
2cdb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2cdc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2cdd0 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
2cde0 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
2cdf0 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
2ce00 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
2ce10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2ce20 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
2ce30 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71  itable..*/.u8 sq
2ce40 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
2ce50 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
2ce60 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2ce70 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
2ce80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2ce90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
2cea0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
2ceb0 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
2cec0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
2ced0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2cee0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2cef0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
2cf00 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2cf10 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
2cf20 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2cf30 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2cf40 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
2cf50 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
2cf60 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2cf70 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67  unt(DbPage *pPag
2cf80 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2cf90 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
2cfa0 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d  fcount(pPage);.}
2cfb0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2cfc0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
2cfd0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2cfe0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
2cff0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
2d000 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
2d010 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
2d020 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
2d030 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
2d040 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [0] = sqlite3Pca
2d050 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
2d060 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2d070 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[1] = sqlite3Pc
2d080 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
2d090 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2d0a0 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33    a[2] = sqlite3
2d0b0 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69  PcacheGetCachesi
2d0c0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
2d0d0 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  he);.  a[3] = pP
2d0e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2d0f0 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72  d ? (int) pPager
2d100 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20  ->dbSize : -1;. 
2d110 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
2d120 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
2d130 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2d140 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
2d150 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
2d160 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
2d170 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
2d180 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
2d190 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
2d1a0 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
2d1b0 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
2d1c0 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
2d1d0 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
2d1e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
2d1f0 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
2d200 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
2d210 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2d220 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28  te3PagerIsMemdb(
2d230 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2d240 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a    return MEMDB;.
2d250 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
2d260 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74  hat there are at
2d270 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e   least nSavepoin
2d280 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65  t savepoints ope
2d290 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  n. If there are.
2d2a0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73  ** currently les
2d2b0 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e  s than nSavepoin
2d2c0 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70  ts open, then op
2d2d0 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  en one or more s
2d2e0 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  avepoints.** to 
2d2f0 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66  make up the diff
2d300 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e  erence. If the n
2d310 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
2d320 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  nts is already.*
2d330 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65  * equal to nSave
2d340 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
2d350 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2d360 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
2d370 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2d380 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  on fails, SQLITE
2d390 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
2d3a0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
2d3b0 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
2d3c0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62   opening the sub
2d3d0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74  -journal file, t
2d3e0 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hen an IO error 
2d3f0 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
2d400 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
2d410 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
2d420 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
2d430 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  enSavepoint(Page
2d440 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
2d450 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
2d460 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d480 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2d490 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2d4a0 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65  nCurrent = pPage
2d4b0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  r->nSavepoint;  
2d4c0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
2d4d0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
2d4e0 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20  oints */..  if( 
2d4f0 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72  nSavepoint>nCurr
2d500 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75  ent && pPager->u
2d510 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2d520 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d540 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2d550 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2d560 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
2d570 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20  int *aNew;      
2d580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d590 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70  New Pager.aSavep
2d5a0 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20  oint array */.. 
2d5b0 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
2d5c0 72 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20  re is no active 
2d5d0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73  journal or the s
2d5e0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  ub-journal is op
2d5f0 65 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  en or .    ** th
2d600 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  e journal is alw
2d610 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  ays stored in me
2d620 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65  mory */.    asse
2d630 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2d640 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f  epoint==0 || isO
2d650 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2d660 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
2d670 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2d680 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2d690 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
2d6a0 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
2d6b0 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
2d6c0 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20  int array using 
2d6d0 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72  realloc(). Retur
2d6e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  n SQLITE_NOMEM. 
2d6f0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c     ** if the all
2d700 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f  ocation fails. O
2d710 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74  therwise, zero t
2d720 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69  he new portion i
2d730 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a  n case a .    **
2d740 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2d750 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70  occurs while pop
2d760 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68  ulating it in th
2d770 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20  e for(...) loop 
2d780 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
2d790 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53    aNew = (PagerS
2d7a0 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74  avepoint *)sqlit
2d7b0 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
2d7c0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
2d7d0 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61  point, sizeof(Pa
2d7e0 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53  gerSavepoint)*nS
2d7f0 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a  avepoint.    );.
2d800 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
2d810 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d820 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2d830 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e  }.    memset(&aN
2d840 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c  ew[nCurrent], 0,
2d850 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75   (nSavepoint-nCu
2d860 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28  rrent) * sizeof(
2d870 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29  PagerSavepoint))
2d880 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
2d890 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b  avepoint = aNew;
2d8a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  .    pPager->nSa
2d8b0 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70  vepoint = nSavep
2d8c0 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f  oint;..    /* Po
2d8d0 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72  pulate the Pager
2d8e0 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
2d8f0 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61  ures just alloca
2d900 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ted. */.    for(
2d910 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c  ii=nCurrent; ii<
2d920 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
2d930 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2d940 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
2d950 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e  alid );.      aN
2d960 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70  ew[ii].nOrig = p
2d970 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2d980 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
2d990 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
2d9a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2d9b0 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ff>0 ){.        
2d9c0 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74  aNew[ii].iOffset
2d9d0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
2d9e0 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  alOff;.      }el
2d9f0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77  se{.        aNew
2da00 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a  [ii].iOffset = J
2da10 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
2da20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
2da30 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53       aNew[ii].iS
2da40 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e  ubRec = pPager->
2da50 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61  nSubRec;.      a
2da60 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
2da70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  oint = sqlite3Bi
2da80 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
2da90 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
2daa0 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e    if( !aNew[ii].
2dab0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  pInSavepoint ){.
2dac0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2dad0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2dae0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2daf0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
2db00 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
2db10 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
2db20 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ened. */.    rc 
2db30 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2db40 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
2db50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2db60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2db70 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2db80 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65  rollback or rele
2db90 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73  ase (commit) a s
2dba0 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65  avepoint..** The
2dbb0 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65   savepoint to re
2dbc0 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
2dbd0 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68  k need not be th
2dbe0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
2dbf0 0a 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76 65  .** created save
2dc00 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  point..**.** Par
2dc10 61 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77  ameter op is alw
2dc20 61 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50  ays either SAVEP
2dc30 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
2dc40 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
2dc50 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  SE..** If it is 
2dc60 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2dc70 45 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20  E, then release 
2dc80 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20  and destroy the 
2dc90 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a  savepoint with.*
2dca0 2a 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69  * index iSavepoi
2dcb0 6e 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  nt. If it is SAV
2dcc0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
2dcd0 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61   then rollback a
2dce0 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68  ll changes.** th
2dcf0 61 74 20 68 61 76 65 20 6f 63 63 75 72 65 64 20  at have occured 
2dd00 73 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66  since the specif
2dd10 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61  ied savepoint wa
2dd20 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
2dd30 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74   The savepoint t
2dd40 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65  o rollback or re
2dd50 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66  lease is identif
2dd60 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
2dd70 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e   .** iSavepoint.
2dd80 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65   A value of 0 me
2dd90 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ans to operate o
2dda0 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  n the outermost 
2ddb0 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68  savepoint.** (th
2ddc0 65 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29  e first created)
2ddd0 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61  . A value of (Pa
2dde0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31  ger.nSavepoint-1
2ddf0 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a  ) means operate.
2de00 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  ** on the most r
2de10 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20  ecently created 
2de20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53  savepoint. If iS
2de30 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
2de40 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67  ter than.** (Pag
2de50 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
2de60 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2de70 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2de80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61  .**.** If a nega
2de90 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61  tive value is pa
2dea0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
2deb0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ction, then the 
2dec0 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
2ded0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
2dee0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
2def0 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c  ifferent to call
2df00 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ing .** sqlite3P
2df10 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62  agerRollback() b
2df20 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
2df30 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65  tion does not te
2df40 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74  rminate.** the t
2df50 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e  ransaction or un
2df60 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
2df70 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f  e, it just resto
2df80 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  res the .** cont
2df90 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
2dfa0 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
2dfb0 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  inal state. .**.
2dfc0 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20  ** In any case, 
2dfd0 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77  all savepoints w
2dfe0 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65  ith an index gre
2dff0 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70  ater than iSavep
2e000 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73  oint .** are des
2e010 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20  troyed. If this 
2e020 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65  is a release ope
2e030 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45  ration (op==SAVE
2e040 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a  POINT_RELEASE),.
2e050 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e  ** then savepoin
2e060 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  t iSavepoint is 
2e070 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a  also destroyed..
2e080 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2e090 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2e0a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
2e0b0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2e0c0 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20  on fails,.** or 
2e0d0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2e0e0 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
2e0f0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c  occurs while rol
2e100 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20  ling back a .** 
2e110 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f  savepoint. If no
2e120 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53   errors occur, S
2e130 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2e140 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  rned..*/ .int sq
2e150 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
2e160 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
2e170 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  r, int op, int i
2e180 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
2e190 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2e1a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ;..  assert( op=
2e1b0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
2e1c0 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
2e1d0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
2e1e0 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
2e1f0 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53  oint>=0 || op==S
2e200 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2e210 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76  K );..  if( iSav
2e220 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e  epoint<pPager->n
2e230 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
2e240 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2e250 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2e260 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
2e270 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
2e280 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e290 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f  remaining savepo
2e2a0 69 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20  ints after this 
2e2b0 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  op. */..    /* F
2e2c0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
2e2d0 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ny savepoints wi
2e2e0 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69  ll still be acti
2e2f0 76 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20  ve after this.  
2e300 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20    ** operation. 
2e310 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65  Store this value
2e320 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66   in nNew. Then f
2e330 72 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73  ree resources as
2e340 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a  sociated .    **
2e350 20 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f   with any savepo
2e360 69 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65  ints that are de
2e370 73 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20  stroyed by this 
2e380 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
2e390 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61  /.    nNew = iSa
2e3a0 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53  vepoint + (op==S
2e3b0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2e3c0 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e  K);.    for(ii=n
2e3d0 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  New; ii<pPager->
2e3e0 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
2e3f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e400 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
2e410 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2e420 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
2e430 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
2e440 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2e450 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a   = nNew;..    /*
2e460 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f   If this is a ro
2e470 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
2e480 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73  , playback the s
2e490 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69  pecified savepoi
2e4a0 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  nt..    ** If th
2e4b0 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  is is a temp-fil
2e4c0 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  e, it is possibl
2e4d0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
2e4e0 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20  al file has.    
2e4f0 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
2e500 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  opened. In this 
2e510 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20  case there have 
2e520 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
2e530 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
2e540 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20  tabase file, so 
2e550 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65  the playback ope
2e560 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b  ration can be sk
2e570 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ipped..    */.  
2e580 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f    if( op==SAVEPO
2e590 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20  INT_ROLLBACK && 
2e5a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2e5b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67  fd) ){.      Pag
2e5c0 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61  erSavepoint *pSa
2e5d0 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d  vepoint = (nNew=
2e5e0 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61  =0)?0:&pPager->a
2e5f0 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31  Savepoint[nNew-1
2e600 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ];.      rc = pa
2e610 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
2e620 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61  oint(pPager, pSa
2e630 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
2e640 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54  assert(rc!=SQLIT
2e650 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20  E_DONE);.    }. 
2e660 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
2e670 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66   is a release of
2e680 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
2e690 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61  avepoint, trunca
2e6a0 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  te .    ** the s
2e6b0 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65  ub-journal to ze
2e6c0 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
2e6d0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65  . */.    if( nNe
2e6e0 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45  w==0 && op==SAVE
2e6f0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26  POINT_RELEASE &&
2e700 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2e710 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  sjfd) ){.      a
2e720 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2e730 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63  E_OK );.      rc
2e740 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
2e750 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  cate(pPager->sjf
2e760 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  d, 0);.      pPa
2e770 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30  ger->nSubRec = 0
2e780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2e790 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2e7a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
2e7b0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
2e7c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2e7d0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2e7e0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
2e7f0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
2e800 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2e810 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
2e820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2e830 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75   the VFS structu
2e840 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  re for the pager
2e850 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
2e860 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50  e3_vfs *sqlite3P
2e870 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70  agerVfs(Pager *p
2e880 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2e890 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d   pPager->pVfs;.}
2e8a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2e8b0 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66  he file handle f
2e8c0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2e8d0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a  file associated.
2e8e0 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
2e8f0 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72  r.  This might r
2e900 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
2e910 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f  e file has.** no
2e920 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
2e930 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69  d..*/.sqlite3_fi
2e940 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  le *sqlite3Pager
2e950 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  File(Pager *pPag
2e960 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2e970 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a  ager->fd;.}../*.
2e980 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
2e990 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
2e9a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2e9b0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2e9c0 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
2e9d0 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
2e9e0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2e9f0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2ea00 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
2ea10 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63  rn true if fsync
2ea20 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73  () calls are dis
2ea30 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70  abled for this p
2ea40 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ager.  Return FA
2ea50 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28  LSE.** if fsync(
2ea60 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20  )s are executed 
2ea70 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  normally..*/.int
2ea80 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
2ea90 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
2eaa0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2eab0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
2eac0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
2ead0 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65  S_CODEC./*.** Se
2eae0 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  t the codec for 
2eaf0 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
2eb00 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
2eb10 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
2eb20 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
2eb30 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
2eb40 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
2eb50 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
2eb60 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72  cArg.){.  pPager
2eb70 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65  ->xCodec = xCode
2eb80 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  c;.  pPager->pCo
2eb90 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41  decArg = pCodecA
2eba0 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  rg;.}.#endif..#i
2ebb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ebc0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
2ebd0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
2ebe0 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e   pPg to location
2ebf0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
2ec00 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  e..**.** There m
2ec10 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
2ec20 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
2ec30 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
2ec40 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28  ted at.** pgno (
2ec50 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50  which we call pP
2ec60 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61  gOld) though tha
2ec70 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65  t page is allowe
2ec80 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61  d to be.** in ca
2ec90 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  che.  If the pag
2eca0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
2ecb0 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20  ated at pgno is 
2ecc0 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
2ecd0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
2ece0 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f  ournal, it is no
2ecf0 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62  t put there by b
2ed00 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
2ed10 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
2ed20 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67   to the page pPg
2ed30 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
2ed40 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
2ed50 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
2ed60 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e  ted with pPg (i.
2ed70 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
2ed80 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
2ed90 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
2eda0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
2edb0 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
2edc0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
2edd0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
2ede0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
2edf0 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
2ee00 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
2ee10 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
2ee20 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
2ee30 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
2ee40 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
2ee50 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
2ee60 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
2ee70 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
2ee80 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
2ee90 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
2eea0 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
2eeb0 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
2eec0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2eed0 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49  active)..**.** I
2eee0 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  f the fourth arg
2eef0 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c  ument, isCommit,
2ef00 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2ef10 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
2ef20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61  being.** moved a
2ef30 73 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61  s part of a data
2ef40 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74  base reorganizat
2ef50 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20  ion just before 
2ef60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2ef70 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  .** is being com
2ef80 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20  mitted. In this 
2ef90 63 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72  case, it is guar
2efa0 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
2efb0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a  database page .*
2efc0 2a 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20  * pPg refers to 
2efd0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
2efe0 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74  ten to again wit
2eff0 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
2f000 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
2f010 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2f020 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f030 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
2f040 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f   code if an erro
2f050 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68  r.** occurs. Oth
2f060 65 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72  erwise, it retur
2f070 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  ns SQLITE_OK..*/
2f080 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2f090 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
2f0a0 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
2f0b0 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pPg, Pgno pgno,
2f0c0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a   int isCommit){.
2f0d0 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
2f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f0f0 2a 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67  * The page being
2f100 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f   overwritten. */
2f110 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
2f120 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Pgno = 0;       
2f130 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20  /* Old value of 
2f140 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79  pPg->pgno, if sy
2f150 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a  nc is required *
2f160 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f180 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2f190 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
2f1a0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
2f1b0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 62  /* If the page b
2f1c0 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69  eing moved is di
2f1d0 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20  rty and has not 
2f1e0 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74 68  been saved by th
2f1f0 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61  e latest.  ** sa
2f200 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61  vepoint, then sa
2f210 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
2f220 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2f230 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  age into the .  
2f240 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e  ** sub-journal n
2f250 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  ow. This is requ
2f260 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  ired to handle t
2f270 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
2f280 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nario:.  **.  **
2f290 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
2f2a0 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
2f2b0 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20   X, then modify 
2f2c0 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20  it in memory>.  
2f2d0 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
2f2e0 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20   one;.  **      
2f2f0 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f   <Move page X to
2f300 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a   location Y>.  *
2f310 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
2f320 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  O one;.  **.  **
2f330 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65 20   If page X were 
2f340 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
2f350 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68  he sub-journal h
2f360 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ere, it would no
2f370 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62  t.  ** be possib
2f380 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74  le to restore it
2f390 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20  s contents when 
2f3a0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
2f3b0 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65   one".  ** state
2f3c0 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f  ment were is pro
2f3d0 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  cessed..  **.  *
2f3e0 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  * subjournalPage
2f3f0 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61  () may need to a
2f400 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
2f410 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f   store pPg->pgno
2f420 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f   into.  ** one o
2f430 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
2f440 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20 69   bitvecs. This i
2f450 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69  s the reason thi
2f460 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
2f470 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2f480 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20  E_NOMEM..  */.  
2f490 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
2f4a0 47 48 44 52 5f 44 49 52 54 59 20 0a 20 20 20 26  GHDR_DIRTY .   &
2f4b0 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
2f4c0 67 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51  ge(pPg).   && SQ
2f4d0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
2f4e0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
2f4f0 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  g)).  ){.    ret
2f500 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
2f510 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45  AGERTRACE(("MOVE
2f520 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
2f530 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
2f540 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
2f550 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2f560 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50  , pPg->pgno, (pP
2f570 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2f580 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70  EED_SYNC)?1:0, p
2f590 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  gno));.  IOTRACE
2f5a0 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
2f5b0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
2f5c0 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
2f5d0 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
2f5e0 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
2f5f0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
2f600 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63  page pPg->pgno c
2f610 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  an.  ** be writt
2f620 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67  en to, store pPg
2f630 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20  ->pgno in local 
2f640 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e  variable needSyn
2f650 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cPgno..  **.  **
2f660 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74   If the isCommit
2f670 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
2f680 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
2f690 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
2f6a0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
2f6b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
2f6c0 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
2f6d0 61 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e  abase page pPg->
2f6e0 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62  pgno .  ** can b
2f6f0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
2f700 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
2f710 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
2f720 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74  t to write to it
2f730 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  ..  */.  if( (pP
2f740 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2f750 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73  EED_SYNC) && !is
2f760 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65  Commit ){.    ne
2f770 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
2f780 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
2f790 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  rt( pageInJourna
2f7a0 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  l(pPg) || pPg->p
2f7b0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
2f7c0 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  igSize );.    as
2f7d0 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
2f7e0 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
2f7f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2f800 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
2f810 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2f820 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
2f830 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
2f840 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
2f850 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
2f860 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e  m its hash chain
2f870 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
2f880 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
2f890 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
2f8a0 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
2f8b0 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
2f8c0 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
2f8d0 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
2f8e0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
2f8f0 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
2f900 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
2f910 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
2f920 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d  SYNC;.  pPgOld =
2f930 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
2f940 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
2f950 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c  ssert( !pPgOld |
2f960 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  | pPgOld->nRef==
2f970 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  1 );.  if( pPgOl
2f980 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c  d ){.    pPg->fl
2f990 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e  ags |= (pPgOld->
2f9a0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2f9b0 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a 0a 20 20 73  _SYNC);.  }..  s
2f9c0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65  qlite3PcacheMove
2f9d0 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  (pPg, pgno);.  i
2f9e0 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
2f9f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
2fa00 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a  op(pPgOld);.  }.
2fa10 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2fa20 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
2fa30 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
2fa40 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28  fied = 1;..  if(
2fa50 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
2fa60 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
2fa70 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
2fa80 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
2fa90 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
2faa0 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
2fab0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
2fac0 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
2fad0 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
2fae0 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
2faf0 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
2fb00 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
2fb10 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
2fb20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
2fb30 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22  nd the .    ** "
2fb40 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69  is journaled" bi
2fb50 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65  tvec flag has be
2fb60 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
2fb70 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
2fb80 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64  d by.    ** load
2fb90 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74  ing the page int
2fba0 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
2fbb0 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
2fbc0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
2fbd0 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20   .    ** flag.. 
2fbe0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2fbf0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  the attempt to l
2fc00 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74  oad the page int
2fc10 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  o the page-cache
2fc20 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20   fails, (due.   
2fc30 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28   ** to a malloc(
2fc40 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29  ) or IO failure)
2fc50 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20  , clear the bit 
2fc60 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61  in the pInJourna
2fc70 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79  l[].    ** array
2fc80 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
2fc90 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64  the page is load
2fca0 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61  ed and written a
2fcb0 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74  gain in.    ** t
2fcc0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
2fcd0 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74   it may be writt
2fce0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
2fcf0 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20  se file before. 
2fd00 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63     ** it is sync
2fd10 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ed into the jour
2fd20 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77  nal file. This w
2fd30 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75  ay, it may end u
2fd40 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  p in.    ** the 
2fd50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69  journal file twi
2fd60 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20  ce, but that is 
2fd70 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20  not a problem.. 
2fd80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
2fd90 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2fda0 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
2fdb0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
2fdc0 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
2fdd0 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
2fde0 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
2fdf0 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
2fe00 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20     */.    PgHdr 
2fe10 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73  *pPgHdr;.    ass
2fe20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
2fe30 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20  dSync );.    rc 
2fe40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2fe50 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79  t(pPager, needSy
2fe60 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29  ncPgno, &pPgHdr)
2fe70 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2fe80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fe90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
2fea0 4a 6f 75 72 6e 61 6c 20 26 26 20 6e 65 65 64 53  Journal && needS
2feb0 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  yncPgno<=pPager-
2fec0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
2fed0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
2fee0 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72  tvecClear(pPager
2fef0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65  ->pInJournal, ne
2ff00 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20  edSyncPgno);.   
2ff10 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
2ff20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2ff30 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2ff40 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74   = 1;.    assert
2ff50 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
2ff60 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b  ==0 && !MEMDB );
2ff70 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61  .    pPgHdr->fla
2ff80 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
2ff90 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74  _SYNC;.    sqlit
2ffa0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
2ffb0 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73  y(pPgHdr);.    s
2ffc0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2ffd0 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20  (pPgHdr);.  }.. 
2ffe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2fff0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
30000 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
30010 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20  ter to the data 
30020 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
30030 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
30040 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
30050 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67  Data(DbPage *pPg
30060 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
30070 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d  ->nRef>0 || pPg-
30080 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  >pPager->memDb )
30090 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  ;.  return pPg->
300a0 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pData;.}../*.** 
300b0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
300c0 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
300d0 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
300e0 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
300f0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
30100 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
30110 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
30120 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
30130 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
30140 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
30150 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
30160 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  er;.  return (pP
30170 61 67 65 72 3f 70 50 67 2d 3e 70 45 78 74 72 61  ager?pPg->pExtra
30180 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  :0);.}../*.** Ge
30190 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
301a0 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
301b0 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
301c0 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
301d0 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
301e0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
301f0 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
30200 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
30210 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
30220 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
30230 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
30240 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
30250 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
30260 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
30270 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
30280 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
30290 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
302a0 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
302b0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
302c0 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
302d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
302e0 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
302f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
30300 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
30310 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
30320 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
30330 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
30340 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
30350 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
30360 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
30370 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
30380 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
30390 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
303a0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
303b0 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  AL.            |
303c0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
303d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
303e0 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
303f0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
30400 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
30410 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
30420 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
30430 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f  L>=0 && PAGER_LO
30440 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
30450 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IVE>=0 );.  if( 
30460 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61  eMode>=0 && !pPa
30470 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
30480 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
30490 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
304a0 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65  )eMode;.  }.  re
304b0 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
304c0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  ->exclusiveMode;
304d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
304e0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  t the journal-mo
304f0 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
30500 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
30510 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  de must be one o
30520 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45  f:.**.**    PAGE
30530 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
30540 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ERY.**    PAGER_
30550 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
30560 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  TE.**    PAGER_J
30570 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
30580 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ATE.**    PAGER_
30590 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
305a0 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  IST.**    PAGER_
305b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a  JOURNALMODE_OFF.
305c0 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
305d0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a  NALMODE_MEMORY.*
305e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61  *.** If the para
305f0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
30600 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ERY, then the jo
30610 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65  urnal-mode is se
30620 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75  t to the.** valu
30630 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
30640 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
30650 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75 72  indicate the cur
30660 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
30670 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d  pdated) journal-
30680 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
30690 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
306a0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
306b0 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
306c0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
306d0 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64      assert( eMod
306e0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
306f0 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
30700 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
30710 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
30720 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  MODE_DELETE.    
30730 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
30740 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
30750 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
30760 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
30770 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
30780 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
30790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
307a0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
307b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
307c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
307d0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
307e0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
307f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30800 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
30810 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 20  E_QUERY<0 );.   
30820 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b   if( eMode>=0 ){
30830 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
30840 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38  ournalMode = (u8
30850 29 65 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c 73  )eMode;.    }els
30860 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
30870 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
30880 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20  URNALMODE_QUERY 
30890 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
308a0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
308b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a  r->journalMode;.
308c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
308d0 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20   the size-limit 
308e0 75 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74  used for persist
308f0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
30900 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  s..*/.i64 sqlite
30910 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a  3PagerJournalSiz
30920 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  eLimit(Pager *pP
30930 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74  ager, i64 iLimit
30940 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e  ){.  if( iLimit>
30950 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =-1 ){.    pPage
30960 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
30970 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20  mit = iLimit;.  
30980 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  }.  return pPage
30990 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
309a0 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  mit;.}../*.** Re
309b0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
309c0 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 42  o the pPager->pB
309d0 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e 20  ackup variable. 
309e0 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75 6c  The backup modul
309f0 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e 63  e.** in backup.c
30a00 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20 63   maintains the c
30a10 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 76  ontent of this v
30a20 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d 6f  ariable. This mo
30a30 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74 20  dule.** uses it 
30a40 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20 61  opaquely as an a
30a50 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74  rgument to sqlit
30a60 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
30a70 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33  ) and.** sqlite3
30a80 42 61 63 6b 75 70 55 70 64 61 74 65 28 29 20 6f  BackupUpdate() o
30a90 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  nly..*/.sqlite3_
30aa0 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65 33  backup **sqlite3
30ab0 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28 50  PagerBackupPtr(P
30ac0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
30ad0 20 72 65 74 75 72 6e 20 26 70 50 61 67 65 72 2d   return &pPager-
30ae0 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 65 6e  >pBackup;.}..#en
30af0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
30b00 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a           IT_DISKIO */.