/ Hex Artifact Content
Login

Artifact e71458a9fff80fd54589f7566dd3b85434814c43:


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 36 31  : pager.c,v 1.61
0350: 37 20 32 30 30 39 2f 30 37 2f 32 34 20 32 31 3a  7 2009/07/24 21:
0360: 32 33 3a 31 36 20 64 72 68 20 45 78 70 20 24 0a  23:16 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 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 41 20 6d      5../*.** A m
1110: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
1120: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
1130: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1140: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1150: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1160: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1170: 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66 28  N,X,E) \.    if(
1180: 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50 2d   P->xCodec && P-
1190: 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65  >xCodec(P->pCode
11a0: 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20 45  c,D,N,X)==0 ){ E
11b0: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
11c0: 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29  EC2(P,D,N,X,E,O)
11d0: 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43   \.    if( P->xC
11e0: 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63 68  odec==0 ){ O=(ch
11f0: 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a 20  ar*)D; }else \. 
1200: 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72 2a     if( (O=(char*
1210: 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70  )(P->xCodec(P->p
1220: 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d 3d  Codec,D,N,X)))==
1230: 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65 0a  0 ){ E; }.#else.
1240: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28  # define CODEC1(
1250: 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a 20  P,D,N,X,E)   /* 
1260: 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e  NO-OP */.# 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: 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29 44  ,E,O) O=(char*)D
1290: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12a0: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
12b0: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  ed sector size. 
12c0: 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53 65  16MB. If the xSe
12d0: 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68 6f  ctorsize() metho
12e0: 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  d .** returns a 
12f0: 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1300: 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41 58  n this, then MAX
1310: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73 20  _SECTOR_SIZE is 
1320: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
1330: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63   This could conc
1340: 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63 6f  eivably cause co
1350: 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  rruption followi
1360: 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ng a power failu
1370: 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20  re on.** such a 
1380: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73 20  system. This is 
1390: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64  currently an und
13a0: 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e  ocumented limit.
13b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
13c0: 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30 31  SECTOR_SIZE 0x01
13d0: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  00000../*.** An 
13e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
13f0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1400: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1410: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
1420: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
1430: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
1440: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
1450: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
1460: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
1470: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1480: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
1490: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
14a0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
14b0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
14c0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
14d0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
14e0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
14f0: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
1500: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1510: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
1520: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
1530: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
1540: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1550: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1560: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
1570: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1580: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
1590: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
15a0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
15b0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
15c0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
15d0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
15e0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
15f0: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
1600: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
1610: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
1620: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
1630: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
1640: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
1650: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
1660: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
1670: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
1680: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
1690: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
16a0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
16b0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
16e0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
16f0: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1700: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1710: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
1720: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
1730: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
1740: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
1750: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
1760: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
1770: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
1780: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1790: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
17a0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
17b0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
17e0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
17f0: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
1800: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
1810: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
1820: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1830: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1840: 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a  **.** errCode.**
1850: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43  .**   Pager.errC
1860: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
1870: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
1880: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1890: 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54  or.**   or SQLIT
18a0: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
18b0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
18c0: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
18d0: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
18e0: 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72  *   and is retur
18f0: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
1900: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
1910: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
1920: 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54    The.**   SQLIT
1930: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
1940: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
1950: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
1960: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
1970: 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73   the.**   next s
1980: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
1990: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
19a0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
19b0: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53  he. Also,.**   S
19c0: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
19d0: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
19e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
19f0: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
1a00: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41  rLookup().**   A
1a10: 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74  PIs, they may st
1a20: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63  ill be used succ
1a30: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  essfully..**.** 
1a40: 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53  dbSizeValid, dbS
1a50: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c  ize, dbOrigSize,
1a60: 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a   dbFileSize.**.*
1a70: 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  *   Managing the
1a80: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1a90: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1aa0: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1ab0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1ac0: 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50    The variable P
1ad0: 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74  ager.dbSize cont
1ae0: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1af0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1b00: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
1b10: 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20  image currently 
1b20: 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65  contains. As the
1b30: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1b40: 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73  grows or shrinks
1b50: 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61   this.**   varia
1b60: 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20  ble is updated. 
1b70: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1b80: 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  er.dbFileSize co
1b90: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
1ba0: 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20  r.**   of pages 
1bb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bc0: 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62  file. This may b
1bd0: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
1be0: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a   Pager.dbSize.**
1bf0: 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73     if some pages
1c00: 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e   have been appen
1c10: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ded to the datab
1c20: 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f  ase image but no
1c30: 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a  t yet written.**
1c40: 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20     out from the 
1c50: 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74  cache to the act
1c60: 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ual file on disk
1c70: 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67  . Or if the imag
1c80: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
1c90: 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20  truncated by an 
1ca0: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1cb0: 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  um operation. Th
1cc0: 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69  e Pager.dbOrigSi
1cd0: 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ze variable.**  
1ce0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1cf0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d10: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1d20: 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61  rent.**   transa
1d30: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
1d40: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
1d50: 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74  f all three of t
1d60: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69  hese variables i
1d70: 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72  s.**   only guar
1d80: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72  anteed to be cor
1d90: 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c  rect if the bool
1da0: 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  ean Pager.dbSize
1db0: 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a  Valid is true..*
1dc0: 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64  *.**   TODO: Und
1dd0: 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f  er what conditio
1de0: 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69  ns is dbSizeVali
1df0: 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a  d set? Cleared?.
1e00: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
1e10: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
1e20: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
1e30: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
1e40: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1e50: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1e60: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
1e70: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
1e80: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
1e90: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
1ea0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
1eb0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
1ec0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
1ed0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
1ee0: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
1ef0: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
1f00: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
1f10: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
1f20: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
1f30: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
1f40: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
1f50: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1f60: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
1f70: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
1f80: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
1f90: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
1fa0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
1fb0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
1fc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1fd0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
1fe0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ff0: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
2000: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
2010: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
2020: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
2030: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
2040: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
2050: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2060: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
2070: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
2080: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
2090: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
20a0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
20b0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
20c0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
20d0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
20e0: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
20f0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2100: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
2110: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
2120: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
2130: 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69  ed..**.** dbModi
2140: 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  fied.**.**   The
2150: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
2160: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2170: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
2180: 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20   is dirtied..** 
2190: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
21a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
21b0: 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ch transaction..
21c0: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73  **.**   It is us
21d0: 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ed when committi
21e0: 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ng or otherwise 
21f0: 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63  ending a transac
2200: 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68  tion. If.**   th
2210: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2220: 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
2230: 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f  less work has to
2240: 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   be done..**.** 
2250: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a  journalStarted.*
2260: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67  *.**   This flag
2270: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2280: 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f   the the main jo
2290: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2e  urnal is synced.
22a0: 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70 6f   .**.**   The po
22b0: 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61 67  int of this flag
22c0: 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73 74   is that it must
22d0: 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74 68   be set after th
22e0: 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a 6f  e .**   first jo
22f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
2300: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  a journal file h
2310: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
2320: 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66 74  o disk..**   Aft
2330: 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70 70  er this has happ
2340: 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73 20  ened, new pages 
2350: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
2360: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 64  database .**   d
2370: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 50  o not need the P
2380: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2390: 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65 79  lag set, as they
23a0: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20   do not need.** 
23b0: 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20    to wait for a 
23c0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65 66  journal sync bef
23d0: 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 20  ore they can be 
23e0: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 2a  written out to.*
23f0: 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65  *   the database
2400: 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63 74   file (see funct
2410: 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65 28  ion pager_write(
2420: 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65 74  ))..**   .** set
2430: 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 54  Master.**.**   T
2440: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
2450: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
2460: 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hat the master j
2470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2480: 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20 69  .**   (if any) i
2490: 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20 69  s only written i
24a0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
24b0: 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a  file once..**.**
24c0: 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74 69     When committi
24d0: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
24e0: 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
24f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 28  rnal file name (
2500: 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61 79  if any).**   may
2510: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
2520: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2530: 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  e while the page
2540: 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a 2a  r is still in.**
2550: 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45     PAGER_RESERVE
2560: 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f 6d  D state (see Com
2570: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66 6f  mitPhaseOne() fo
2580: 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20 49  r the action). I
2590: 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74 65  t.**   then atte
25a0: 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65 20  mpts to upgrade 
25b0: 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  to an exclusive 
25c0: 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61 74  lock. If this at
25d0: 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c 73  tempt.**   fails
25e0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42 55  , then SQLITE_BU
25f0: 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  SY may be return
2600: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61  ed to the user a
2610: 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 20  nd the user.**  
2620: 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
2630: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
2640: 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74  action again lat
2650: 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20 20  er (calling.**  
2660: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2670: 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20 66  ) again). This f
2680: 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20 65  lag is used to e
2690: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 0a  nsure that the .
26a0: 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72  **   master jour
26b0: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c 79  nal name is only
26c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
26d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
26e0: 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d 65   first.**   time
26f0: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2700: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
2710: 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a 0a  ** doNotSync.**.
2720: 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62  **   This variab
2730: 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c  le is set and cl
2740: 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  eared by sqlite3
2750: 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a 2a  PagerWrite()..**
2760: 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a  .** needSync.**.
2770: 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d 69  **   TODO: It mi
2780: 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74 6f  ght be easier to
2790: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
27a0: 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72 6e  le in writeJourn
27b0: 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e 64  alHdr().**   and
27c0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
27d0: 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61 6e  nal() only. Chan
27e0: 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20 74  ge its meaning t
27f0: 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74 61  o "unsynced data
2800: 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20 77  .**   has been w
2810: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2820: 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73 75  urnal"..**.** su
2830: 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a  bjInMemory.**.**
2840: 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f     This is a boo
2850: 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49  lean variable. I
2860: 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  f true, then any
2870: 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f   required sub-jo
2880: 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70  urnal.**   is op
2890: 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
28a0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
28b0: 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65  e. If false, the
28c0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20  n in-memory.**  
28d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72   sub-journals ar
28e0: 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  e only used for 
28f0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
2900: 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  files..*/.struct
2910: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
2920: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
2930: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
2940: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
2950: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
2960: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
2970: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
2980: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
2990: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
29a0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
29b0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
29c0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
29d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29e0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
29f0: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2a10: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
2a20: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
2a30: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
2a40: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
2a50: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
2a60: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
2a70: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
2a80: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2aa0: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
2ab0: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
2ac0: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae0: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
2af0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2b00: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
2b10: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
2b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2b30: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
2b40: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
2b50: 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  L */.  u8 tempFi
2b60: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2b70: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2b80: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2b90: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
2ba0: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
2bb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2bc0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
2bd0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d 65  abase */.  u8 me
2be0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
2bf0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2c00: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
2c10: 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a 20  le I/O */..  /* 
2c20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2c30: 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f  ock contains tho
2c40: 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73  se class members
2c50: 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d 69   that are dynami
2c60: 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69 66  cally.  ** modif
2c70: 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61  ied during norma
2c80: 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54 68  l operations. Th
2c90: 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65  e other variable
2ca0: 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  s in this struct
2cb0: 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69 74  ure.  ** are eit
2cc0: 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 72  her constant thr
2cd0: 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66 65  oughout the life
2ce0: 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67 65  time of the page
2cf0: 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20  r, or else.  ** 
2d00: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63 6f  used to store co
2d10: 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61  nfiguration para
2d20: 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66 65  meters that affe
2d30: 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20 70  ct the way the p
2d40: 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72 61  ager .  ** opera
2d50: 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  tes..  **.  ** T
2d60: 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69 61  he 'state' varia
2d70: 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65 64  ble is described
2d80: 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c 20   in more detail 
2d90: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a 20  along with the. 
2da0: 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e 73   ** descriptions
2db0: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 69   of the values i
2dc0: 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41 47  t may take - PAG
2dd0: 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20 4d  ER_UNLOCK etc. M
2de0: 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  any of the.  ** 
2df0: 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73 20  other variables 
2e00: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
2e10: 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  e described in t
2e20: 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65 63  he comment direc
2e30: 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20  tly .  ** above 
2e40: 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69 6e  this class defin
2e50: 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75 38  ition..  */.  u8
2e60: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
2e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
2e80: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
2e90: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
2ea0: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f  tc. */.  u8 dbMo
2eb0: 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20 20  dified;         
2ec0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2ed0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63 68  there are any ch
2ee0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62 20  anges to the Db 
2ef0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
2f20: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
2f30: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
2f40: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53  */.  u8 journalS
2f50: 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  tarted;         
2f60: 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64   /* True if head
2f70: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73  er of journal is
2f80: 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20   synced */.  u8 
2f90: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b  changeCountDone;
2fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
2fb0: 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69  after incrementi
2fc0: 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ng the change-co
2fd0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65  unter */.  u8 se
2fe0: 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  tMaster;        
2ff0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3000: 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73  f a m-j name has
3010: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
3020: 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f   jrnl */.  u8 do
3030: 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20  NotSync;        
3040: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3050: 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64  n. While true, d
3060: 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20  o not spill the 
3070: 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64 62  cache */.  u8 db
3080: 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20 20  SizeValid;      
3090: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77 68         /* Set wh
30a0: 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f 72  en dbSize is cor
30b0: 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75 62  rect */.  u8 sub
30c0: 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20 20  jInMemory;      
30d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
30e0: 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   use in-memory s
30f0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
3100: 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20   Pgno dbSize;   
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3120: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3130: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3140: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67  */.  Pgno dbOrig
3150: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3160: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
3170: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  e the current tr
3180: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50  ansaction */.  P
3190: 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20  gno dbFileSize; 
31a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
31c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31d0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  le */.  int errC
31e0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
31f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
3200: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
3210: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rrors */.  int n
3220: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
3230: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
3240: 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65  journalled since
3250: 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77   last j-header w
3260: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20  ritten */.  u32 
3270: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
3280: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
3290: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
32a0: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
32b0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e  cksum */.  u32 n
32c0: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
32d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32e0: 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74   of records writ
32f0: 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e  ten to sub-journ
3300: 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  al */.  Bitvec *
3310: 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  pInJournal;     
3320: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
3330: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
3340: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3350: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
3360: 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20  ile *fd;        
3370: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
3380: 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61  iptor for databa
3390: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  se */.  sqlite3_
33a0: 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20  file *jfd;      
33b0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
33c0: 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20  riptor for main 
33d0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
33e0: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
33f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
3400: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
3410: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
3420: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3440: 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66  Current write of
3450: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
3460: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
3470: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
3480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
3490: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
34a0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
34b0: 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53 61  der */.  PagerSa
34c0: 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f  vepoint *aSavepo
34d0: 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66  int; /* Array of
34e0: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
34f0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76  ts */.  int nSav
3500: 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20  epoint;         
3510: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3520: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61   elements in aSa
3530: 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63  vepoint[] */.  c
3540: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
3550: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
3560: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
3570: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
3580: 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73 65  nges */.  u32 se
3590: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
35a0: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
35b0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
35c0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
35d0: 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20  .  u16 nExtra;  
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35f0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
3600: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
3610: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
3620: 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20    i16 nReserve; 
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3640: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
3650: 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f  d bytes at end o
3660: 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  f each page */. 
3670: 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20   u32 vfsFlags;  
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3690: 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  Flags for sqlite
36a0: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
36b0: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
36e0: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
36f0: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3710: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
3720: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
3730: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
3740: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
3750: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3760: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3770: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
3780: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
3790: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
37a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37b0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
37c0: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
37d0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
37e0: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
37f0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
3800: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
3810: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
3820: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
3830: 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20 53  dler */.#ifdef S
3840: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
3850: 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20   nHit, nMiss;   
3860: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68           /* Cach
3870: 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69  e hits and missi
3880: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ng */.  int nRea
3890: 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  d, nWrite;      
38a0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
38b0: 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74  pages read/writt
38c0: 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76  en */.#endif.  v
38d0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
38e0: 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61  (DbPage*); /* Ca
38f0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
3900: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
3910: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
3920: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
3930: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
3940: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
3950: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
3960: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
3970: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
3980: 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43  id (*xCodecSizeC
3990: 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69  hng)(void*,int,i
39a0: 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f  nt); /* Notify o
39b0: 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e  f page size chan
39c0: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
39d0: 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64  xCodecFree)(void
39e0: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
39f0: 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f  /* Destructor fo
3a00: 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20  r the codec */. 
3a10: 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20   void *pCodec;  
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a30: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
3a40: 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68  o xCodec... meth
3a50: 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ods */.#endif.  
3a60: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3a80: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
3a90: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
3aa0: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36   tmp use */.  i6
3ab0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
3ac0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
3ad0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
3ae0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
3af0: 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65  iles */.  PCache
3b00: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
3b10: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
3b20: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
3b30: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
3b40: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
3b50: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
3b60: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
3b70: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
3b80: 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  esses */.};../*.
3b90: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3ba0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3bb0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3bc0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3bd0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3be0: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
3bf0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
3c00: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
3c10: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
3c20: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
3c30: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
3c40: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3c50: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3c60: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
3c70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3c80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3c90: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3ca0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3cb0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3cc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3cd0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3ce0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3cf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3d00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3d10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3d20: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3d30: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3d40: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
3d50: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
3d60: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
3d70: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
3d80: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
3d90: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3da0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3db0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3dc0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3dd0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3de0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3df0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3e00: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3e10: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3e20: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3e30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
3e40: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
3e50: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
3e60: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3e70: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
3e80: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
3e90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3ea0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
3eb0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3ec0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3ed0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3ee0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3ef0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3f00: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3f10: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3f20: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
3f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
3f50: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
3f60: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
3f70: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
3f80: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
3f90: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3fa0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3fb0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3fc0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3fd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3fe0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3ff0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
4000: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
4010: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
4020: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
4030: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
4040: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
4050: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
4060: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
4070: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
4080: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
4090: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
40a0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
40b0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
40c0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
40d0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
40e0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
40f0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
4100: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
4110: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
4120: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
4130: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
4140: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
4150: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
4160: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
4170: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
4180: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
4190: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
41a0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
41b0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
41c0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
41d0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
41e0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
41f0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
4200: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
4210: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
4220: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
4230: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
4240: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
4250: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
4260: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
4270: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
4280: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
4290: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
42a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
42b0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
42c0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
42d0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
42e0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
42f0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
4300: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
4310: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
4320: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
4330: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
4340: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
4350: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
4360: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4370: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4380: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
4390: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
43a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
43b0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
43c0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
43d0: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
43e0: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
43f0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
4400: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
4410: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
4420: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4430: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
4440: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
4450: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
4460: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
4470: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
4480: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
4490: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
44a0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
44b0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
44c0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
44d0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
44e0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
44f0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
4500: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
4510: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
4520: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
4530: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
4540: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
4550: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
4560: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
4570: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
4580: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
4590: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
45a0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
45b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
45c0: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
45d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
45e0: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
45f0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
4600: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
4610: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
4620: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
4630: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
4640: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
4650: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73  (pPager) );.*/.s
4660: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
4670: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
4680: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
4690: 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69  /* A temp-file i
46a0: 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45  s always in PAGE
46b0: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50  R_EXCLUSIVE or P
46c0: 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74  AGER_SYNCED stat
46d0: 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
46e0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
46f0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ==0 || pPager->s
4700: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
4710: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54  USIVE );..  /* T
4720: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
4730: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
4740: 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66  s set for temp-f
4750: 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
4760: 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
4770: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4780: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
4790: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b   );..  return 1;
47a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
47b0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
47c0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
47d0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
47e0: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
47f0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
4800: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
4810: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4820: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
4830: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
4840: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
4850: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
4860: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
4870: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
4880: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4890: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
48a0: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
48b0: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
48c0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
48d0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
48e0: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
48f0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
4900: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
4910: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
4920: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
4930: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
4940: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
4950: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
4960: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
4970: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
4980: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4990: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
49a0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
49b0: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
49c0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
49d0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
49e0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
49f0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
4a00: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
4a10: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
4a20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
4a30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4a40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4a50: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4a60: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
4a70: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
4a80: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
4a90: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
4aa0: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
4ab0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
4ac0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
4ad0: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
4ae0: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
4af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
4b00: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4b10: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4b20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4b30: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4b40: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4b50: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4b70: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4b80: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4b90: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4ba0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4bb0: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4bc0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4bd0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4be0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
4bf0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
4c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
4c10: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
4c20: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
4c30: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4c40: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4c50: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4c60: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
4c70: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
4c80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4c90: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
4ca0: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
4cb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4cc0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4cd0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4ce0: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4cf0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
4d00: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
4d10: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
4d20: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
4d30: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
4d40: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
4d50: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4d60: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
4d70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4d80: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4d90: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4da0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4db0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4dc0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4dd0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4de0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
4df0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4e00: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
4e10: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4e20: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4e30: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4e40: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4e50: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
4e60: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
4e70: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
4e80: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
4e90: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
4ea0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
4eb0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
4ec0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
4ed0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
4ee0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
4ef0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
4f00: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
4f10: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
4f20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
4f30: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
4f40: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
4f50: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
4f60: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
4f70: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
4f80: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
4f90: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
4fa0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
4fb0: 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69  ** If file pFd i
4fc0: 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c  s open, call sql
4fd0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f  ite3OsUnlock() o
4fe0: 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n it..*/.static 
4ff0: 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c  int osUnlock(sql
5000: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20  ite3_file *pFd, 
5010: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66  int eLock){.  if
5020: 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29  ( !isOpen(pFd) )
5030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5040: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
5050: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
5060: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
5070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5080: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
5090: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
50a0: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
50b0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
50c0: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
50d0: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
50e0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
50f0: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
5100: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
5110: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
5120: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
5130: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
5140: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
5150: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
5160: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
5170: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
5180: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
5190: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
51a0: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
51b0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
51c0: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
51d0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
51e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69  **.** The optimi
51f0: 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61  zation is also a
5200: 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f  lways enabled fo
5210: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
5220: 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65  s. It is.** an e
5230: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
5240: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50  s function if pP
5250: 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  ager is opened o
5260: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  n an in-memory.*
5270: 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  * database..**.*
5280: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
5290: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
52a0: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
52b0: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
52c0: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
52d0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
52e0: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
52f0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
5300: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
5310: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
5320: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
5330: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
5340: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5350: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
5360: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
5370: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
5380: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
5390: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
53a0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
53b0: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
53c0: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   dc;            
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
53e0: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
53f0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
5400: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
5430: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61   */.    int szPa
5440: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
5450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
5460: 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61  e size */..    a
5470: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
5480: 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20  ager->fd) );.   
5490: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
54a0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
54b0: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
54c0: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
54d0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
54e0: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
54f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
5500: 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53  e;..    assert(S
5510: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
5520: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
5530: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ;.    assert(SQL
5540: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
5550: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
5560: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63  ;.    if( 0==(dc
5570: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
5580: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
5590: 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a  )) || nSector>sz
55a0: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72  Page) ){.      r
55b0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
55c0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55   }..  return JOU
55d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
55e0: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
55f0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23  _SZ(pPager);.}.#
5600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
5610: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
5620: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
5630: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
5640: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
5650: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
5660: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
5670: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
5680: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
5690: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
56a0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
56b0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
56c0: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
56d0: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
56e0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
56f0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
5700: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
5710: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
5720: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
5730: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
5740: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
5750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5760: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
5770: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
5780: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
5790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
57a0: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
57b0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
57c0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
57d0: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
57e0: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
57f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
5800: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
5810: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
5820: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
5830: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
5840: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5850: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
5860: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
5870: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
5880: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5890: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
58a0: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
58b0: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
58c0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
58d0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
58e0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
58f0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
5900: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
5910: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
5920: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
5930: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
5940: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5950: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5960: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5970: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5980: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5990: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
59a0: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
59b0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
59c0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
59d0: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
59e0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
59f0: 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  de.      || (pPg
5a00: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
5a10: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
5a20: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
5a30: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
5a40: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
5a50: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
5a60: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
5a70: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
5a80: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
5a90: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
5aa0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
5ab0: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
5ac0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
5ad0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5ae0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
5af0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
5b00: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
5b10: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
5b20: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5b40: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
5b50: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
5b60: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
5b70: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
5b80: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
5b90: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
5ba0: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
5bb0: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
5bc0: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
5bd0: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
5be0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
5bf0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5c00: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
5c10: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
5c20: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
5c30: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
5c40: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
5c50: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
5c60: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
5c70: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
5c80: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
5c90: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
5ca0: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
5cb0: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
5cc0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
5cd0: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
5ce0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
5cf0: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
5d00: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
5d10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5d20: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
5d30: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
5d40: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
5d50: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
5d60: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
5d70: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
5d80: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
5d90: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
5da0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
5db0: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
5dc0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5dd0: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
5de0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
5df0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
5e00: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
5e10: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
5e20: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
5e30: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
5e40: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
5e50: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
5e60: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
5e70: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
5e80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
5e90: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
5ea0: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
5eb0: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
5ec0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5ed0: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
5ee0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
5ef0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
5f00: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5f10: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5f20: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
5f30: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
5f40: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
5f50: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
5f60: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
5f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5f80: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5f90: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
5fa0: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
5fb0: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
5fc0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
5ff0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
6020: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
6030: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
6040: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
6050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
6060: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
6070: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
6080: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
6090: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
60a0: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
60b0: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
60c0: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
60d0: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
60f0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
6100: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
6110: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
6120: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
6130: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6140: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
6150: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
6160: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
6170: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
6180: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
6190: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
61a0: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
61b0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
61c0: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
61d0: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
61e0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
61f0: 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ter .   || SQLIT
6200: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
6210: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
6220: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20  J-12, &cksum)). 
6230: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
6240: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
6250: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
6260: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20  c, 8, szJ-8)).  
6270: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
6280: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
6290: 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  , 8).   || SQLIT
62a0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
62b0: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
62c0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
62d0: 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b  zJ-16-len)).  ){
62e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
62f0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
6300: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
6310: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
6320: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
6330: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
6340: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
6350: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
6360: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
6370: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
6380: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
6390: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
63a0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
63b0: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
63c0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
63d0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
63e0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
63f0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
6400: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
6410: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
6420: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
6430: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
6440: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
6450: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
6460: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
6470: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
6480: 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  = 0;.  }.  zMast
6490: 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  er[len] = '\0';.
64a0: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
64b0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
64c0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
64d0: 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  et of the sector
64e0: 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20   boundary at or 
64f0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
6500: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61  following the va
6510: 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a  lue in pPager->j
6520: 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d  ournalOff, assum
6530: 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a  ing a sector .**
6540: 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d   size of pPager-
6550: 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65  >sectorSize byte
6560: 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  s..**.** i.e for
6570: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
6580: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50  f 512:.**.**   P
6590: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
65a0: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
65b0: 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  value.**   -----
65c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20    0.**   512    
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6620: 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20     512.**   100 
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32        512.**   2
6650: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
6660: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
6670: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20   .*/.static i64 
6680: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
6690: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
66a0: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
66b0: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
66c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
66d0: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
66e0: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
66f0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6700: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
6710: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6720: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
6730: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
6740: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6750: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
6760: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
6770: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
6780: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
6790: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
67a0: 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d  return offset;.}
67b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
67c0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
67d0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
67e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
67f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
6800: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
6810: 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  op if the journa
6820: 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  l file has not b
6830: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a  een written to.*
6840: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  * within the cur
6850: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6860: 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e   (i.e. if Pager.
6870: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a  journalOff==0)..
6880: 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63  **.** If doTrunc
6890: 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ate is non-zero 
68a0: 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75  or the Pager.jou
68b0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61  rnalSizeLimit va
68c0: 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74  riable is.** set
68d0: 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e   to 0, then trun
68e0: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
68f0: 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79   file to zero by
6900: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68  tes in size. Oth
6910: 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20  erwise,.** zero 
6920: 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64  the 28-byte head
6930: 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20  er at the start 
6940: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
6950: 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63  ile. In either c
6960: 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20  ase, .** if the 
6970: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
6980: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79  no-sync mode, sy
6990: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
69a0: 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ile immediately 
69b0: 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e  .** after writin
69c0: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
69d0: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67  it..**.** If Pag
69e0: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
69f0: 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20  mit is set to a 
6a00: 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65  positive, non-ze
6a10: 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a  ro value, and.**
6a20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   following the t
6a30: 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72  runcation or zer
6a40: 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61  oing described a
6a50: 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66  bove the size of
6a60: 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   the .** journal
6a70: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69   file in bytes i
6a80: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6a90: 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  is value, then t
6aa0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a  runcate the.** j
6ab0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50  ournal file to P
6ac0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
6ad0: 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65  Limit bytes. The
6ae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
6af0: 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74  es.** not need t
6b00: 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c  o be synced foll
6b10: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
6b20: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
6b30: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
6b40: 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  s, abandon proce
6b50: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
6b60: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
6b70: 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  de..** Otherwise
6b80: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6b90: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
6ba0: 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  t zeroJournalHdr
6bb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6bc0: 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b  int doTruncate){
6bd0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6be0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
6c10: 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
6c20: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
6c30: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
6c40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6c50: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
6c60: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
6c70: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
6c80: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
6c90: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
6ca0: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
6cb0: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
6cc0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
6cd0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
6ce0: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
6cf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6d00: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6d10: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
6d20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
6d30: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
6d40: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
6d50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6d60: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6d70: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
6d80: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
6d90: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
6da0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6db0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
6dc0: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
6dd0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
6de0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
6df0: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
6e00: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  Y|pPager->sync_f
6e10: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
6e20: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
6e30: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
6e40: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
6e50: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
6e60: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
6e70: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
6e80: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
6e90: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
6ea0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
6eb0: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
6ec0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
6ed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6ee0: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
6ef0: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
6f00: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
6f10: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
6f20: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
6f30: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
6f40: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
6f50: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
6f60: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6f70: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
6f80: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6f90: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
6fa0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
6fb0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6fc0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
6fd0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
6fe0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6ff0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
7000: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
7010: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7020: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7030: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
7040: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7050: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7060: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
7070: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
7080: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
7090: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
70a0: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
70b0: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
70c0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
70d0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
70e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
70f0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
7100: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
7110: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
7120: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
7130: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
7140: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
7150: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
7160: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
7170: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
7180: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
7190: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
71a0: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
71b0: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
71c0: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
71d0: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
71e0: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
71f0: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
7200: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
7210: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
7220: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
7230: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
7240: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
7250: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
7260: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
7270: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
7280: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
7290: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
72a0: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
72b0: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
72c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
72d0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
72e0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
72f0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7310: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
7320: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
7330: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
7340: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
7350: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
7360: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
7370: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
7380: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7390: 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  e;     /* Size o
73a0: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
73b0: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
73c0: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
73f0: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
7400: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
7410: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
7440: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
7450: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
7460: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
7470: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
7480: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
7490: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
74a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
74b0: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
74c0: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
74d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
74e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
74f0: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
7500: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
7510: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
7520: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
7530: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
7540: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
7550: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
7560: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
7570: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
7580: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
7590: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
75a0: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
75b0: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
75c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
75d0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
75e0: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
75f0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
7600: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
7610: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
7620: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
7630: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
7640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
7650: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7660: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
7670: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
7680: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
7690: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
76a0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
76b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
76c0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
76d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
76e0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
76f0: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
7700: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
7710: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
7720: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
7730: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
7740: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
7750: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
7760: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
7770: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
7780: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
7790: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
77a0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
77b0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
77c0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
77d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
77e0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
77f0: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
7800: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
7810: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
7820: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
7830: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
7840: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
7850: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
7860: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
7870: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7880: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
7890: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
78a0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
78b0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
78c0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
78d0: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  e occurred whils
78e0: 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
78f0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
7900: 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69  le it may contai
7910: 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64  n some garbage d
7920: 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74  ata. There are t
7930: 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a  wo scenarios.  *
7940: 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73  * where this ris
7950: 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  k can be ignored
7960: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  :.  **.  **   * 
7970: 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69  When the pager i
7980: 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
7990: 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61  e. Corruption ca
79a0: 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20  n follow a.  ** 
79b0: 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72      power failur
79c0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  e in this case a
79d0: 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nyway..  **.  **
79e0: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51     * When the SQ
79f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
7a00: 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73  APPEND flag is s
7a10: 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  et. This guarant
7a20: 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61  ees.  **     tha
7a30: 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69  t garbage data i
7a40: 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64  s never appended
7a50: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
7a60: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
7a70: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
7a80: 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
7a90: 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69  r->noSync );.  i
7aa0: 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( (pPager->noSy
7ab0: 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  nc) || (pPager->
7ac0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
7ad0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
7ae0: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
7af0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
7b00: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
7b10: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
7b20: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
7b30: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
7b40: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
7b50: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
7b60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b70: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
7b80: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7b90: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7ba0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
7bb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 48 65    }else{.    zHe
7bc0: 61 64 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ader[0] = '\0';.
7bd0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
7be0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7bf0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7c00: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
7c10: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
7c20: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
7c30: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
7c40: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
7c50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7c60: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
7c70: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
7c80: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
7c90: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7ca0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
7cb0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
7cc0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
7cd0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
7ce0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7cf0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7d00: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
7d10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
7d20: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
7d30: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
7d40: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
7d50: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7d60: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7d70: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
7d80: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
7d90: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
7da0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
7db0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7dc0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7dd0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
7de0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
7df0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7e00: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
7e10: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
7e20: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
7e30: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
7e40: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
7e50: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
7e60: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
7e70: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
7e80: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
7e90: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
7ea0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
7eb0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
7ec0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
7ed0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
7ee0: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
7ef0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
7f00: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f10: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
7f20: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
7f30: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7f40: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
7f50: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
7f60: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
7f70: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
7f80: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
7f90: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
7fa0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
7fb0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
7fc0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
7fd0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
7fe0: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
7ff0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
8000: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
8010: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
8020: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
8030: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
8040: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
8050: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
8060: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
8070: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
8080: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
8090: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
80a0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
80b0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
80c0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
80d0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
80e0: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
80f0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
8100: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
8110: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
8120: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
8130: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
8140: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
8150: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
8160: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
8170: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
8180: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
8190: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
81a0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
81b0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
81c0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
81d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
81e0: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
81f0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
8200: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
8210: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
8220: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
8230: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
8240: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
8250: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
8260: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
8270: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
8280: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
8290: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
82a0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
82b0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
82c0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
82d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
82e0: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
82f0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
8300: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
8310: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
8320: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
8330: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
8340: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
8350: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
8360: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
8370: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
8380: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
8390: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
83a0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
83b0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
83c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
83d0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
83e0: 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72  alOff += nHeader
83f0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8400: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
8410: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
8420: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
8430: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
8440: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
8450: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
8460: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
8470: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
8480: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
8490: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
84a0: 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75  .** file. The cu
84b0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
84c0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
84d0: 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  le is given by.*
84e0: 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
84f0: 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  lOff. See commen
8500: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
8510: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
8520: 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73  r() for.** a des
8530: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
8540: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
8550: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
8560: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
8570: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
8580: 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74   *pNRec is set t
8590: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
85a0: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
85b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
85c0: 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69  eader and *pDbSi
85d0: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
85e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
85f0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
8600: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
8610: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
8620: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
8630: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
8640: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
8650: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
8660: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
8670: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
8680: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
8690: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
86b0: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
86c0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
86d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
86e0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
86f0: 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a  NRec and *PDbSiz
8700: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
8710: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
8720: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
8730: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
8740: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8750: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
8760: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8770: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
8780: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
8790: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
87a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
87b0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
87c0: 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20  nt isHot,.  i64 
87d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20  journalSize,    
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
87f0: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
8800: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
8810: 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52  es */.  u32 *pNR
8820: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
8830: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
8840: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
8850: 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20   nRec field */. 
8860: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20   u32 *pDbSize   
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8880: 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f   OUT: Value of o
8890: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
88a0: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29   size field */.)
88b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
88e0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
88f0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
8900: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
8910: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
8920: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
8930: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
8940: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8950: 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  et of journal he
8960: 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20  ader being read 
8970: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
8980: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8990: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
89a0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
89b0: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a  e open. */..  /*
89c0: 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a   Advance Pager.j
89d0: 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65  ournalOff to the
89e0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
89f0: 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68  xt sector. If th
8a00: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
8a10: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
8a20: 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
8a30: 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64   a header stored
8a40: 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
8a50: 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  int, return SQLI
8a60: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20  TE_DONE..  */.  
8a70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8a80: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
8a90: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
8aa0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8ab0: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
8ac0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
8ad0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
8ae0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8af0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48  E_DONE;.  }.  iH
8b00: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
8b10: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
8b20: 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69  * Read in the fi
8b30: 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
8b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8b50: 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f  r. If they do no
8b60: 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65  t match.  ** the
8b70: 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66    magic string f
8b80: 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72  ound at the star
8b90: 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61  t of each journa
8ba0: 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e  l header, return
8bb0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
8bc0: 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  E. If an IO erro
8bd0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
8be0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
8bf0: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20  Otherwise,.  ** 
8c00: 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
8c10: 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64  if( isHot || iHd
8c20: 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  rOff!=pPager->jo
8c30: 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20  urnalHdr ){.    
8c40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8c50: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
8c60: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
8c70: 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29  Magic), iHdrOff)
8c80: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
8c90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
8cb0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8cc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8cd0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
8ce0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8cf0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
8d00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61   }.  }..  /* Rea
8d10: 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  d the first thre
8d20: 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20  e 32-bit fields 
8d30: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
8d40: 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a  eader: The nRec.
8d50: 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20    ** field, the 
8d60: 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c  checksum-initial
8d70: 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74  izer and the dat
8d80: 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68  abase size at th
8d90: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
8da0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
8db0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
8dc0: 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
8dd0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20  g goes wrong..  
8de0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
8df0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8e00: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8e10: 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52  , iHdrOff+8, pNR
8e20: 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ec)).   || SQLIT
8e30: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e40: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8e50: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20  fd, iHdrOff+12, 
8e60: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
8e70: 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  it)).   || SQLIT
8e80: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8e90: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8ea0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20  fd, iHdrOff+16, 
8eb0: 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20  pDbSize)).  ){. 
8ec0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8ed0: 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
8ee0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
8ef0: 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53  {.    u32 iPageS
8f00: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8f10: 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20     /* Page-size 
8f20: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
8f30: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
8f40: 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  32 iSectorSize; 
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8f60: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
8f70: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
8f80: 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50  er */.    u16 iP
8f90: 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20  ageSize16;      
8fa0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
8fb0: 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31  f iPageSize in 1
8fc0: 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a  6-bit variable *
8fd0: 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
8fe0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
8ff0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
9000: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
9010: 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
9020: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
9030: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
9040: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
9050: 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
9060: 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
9070: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
9080: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9090: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
90a0: 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
90b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
90c0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
90d0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
90e0: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
90f0: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
9100: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
9110: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
9120: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
9130: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
9140: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
9150: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
9160: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
9170: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
9180: 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20 61 6e  equal to 512, an
9190: 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
91a0: 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
91b0: 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
91c0: 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
91d0: 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
91e0: 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
91f0: 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
9200: 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
9210: 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20 7c  rSize<512.     |
9220: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
9230: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
9240: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
9250: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
9260: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
9270: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
9280: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
9290: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
92a0: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
92b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
92c0: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
92d0: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
92e0: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
92f0: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
9300: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
9310: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
9320: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
9330: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
9340: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
9350: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
9360: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
9370: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
9380: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
9390: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
93a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
93b0: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
93c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
93d0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
93e0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
93f0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
9400: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
9410: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
9420: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
9430: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
9440: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
9450: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
9460: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
9470: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
9480: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
9490: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
94a0: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
94b0: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
94c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
94d0: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
94e0: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
94f0: 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  16, -1);.    tes
9500: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
9510: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  E_OK );.    asse
9520: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
9530: 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 31 36  K || iPageSize16
9540: 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69 7a 65  ==(u16)iPageSize
9550: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
9560: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
9570: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
9580: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
9590: 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
95a0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
95b0: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
95c0: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
95d0: 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
95e0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
95f0: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
9600: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
9610: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
9620: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
9630: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
9640: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
9650: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
9660: 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
9670: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
9680: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
9690: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
96a0: 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
96b0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
96c0: 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
96d0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
96e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
96f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
9700: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
9710: 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
9720: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
9730: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
9740: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
9750: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
9760: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
9770: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
9780: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
9790: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
97a0: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
97b0: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
97c0: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
97d0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
97e0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
97f0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
9800: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
9810: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
9820: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
9830: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
9840: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
9850: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
9860: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
9870: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
9880: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
9890: 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
98a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
98b0: 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
98c0: 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
98d0: 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
98e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
98f0: 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
9900: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
9910: 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
9920: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9930: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
9940: 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
9950: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
9960: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
9970: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
9980: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
9990: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
99a0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
99b0: 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
99c0: 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
99d0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
99e0: 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
99f0: 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
9a00: 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
9a10: 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
9a20: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
9a30: 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
9a40: 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
9a50: 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
9a60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
9a70: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
9a80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
9a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
9aa0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
9ad0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
9ae0: 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9b00: 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
9b10: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
9b20: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b40: 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
9b50: 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
9b60: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
9b70: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
9b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9b90: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
9ba0: 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
9bb0: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9bd0: 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
9be0: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
9bf0: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
9c00: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
9c10: 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61 67 65  ster.   || pPage
9c20: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
9c30: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9c40: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
9c50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
9c60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9c70: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b  ALMODE_OFF .  ){
9c80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9c90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61  TE_OK;.  }.  pPa
9ca0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
9cb0: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   1;.  assert( is
9cc0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9cd0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  ) );..  /* Calcu
9ce0: 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
9cf0: 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
9d00: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
9d10: 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
9d20: 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
9d30: 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
9d40: 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
9d50: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
9d60: 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
9d70: 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
9d80: 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
9d90: 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
9da0: 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
9db0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
9dc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9dd0: 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
9de0: 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
9df0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
9e00: 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
9e10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
9e20: 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
9e30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
9e40: 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
9e50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9e60: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
9e70: 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
9e80: 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
9e90: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
9ea0: 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
9eb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
9ec0: 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
9ed0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
9ee0: 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
9ef0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
9f00: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
9f10: 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
9f20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
9f30: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9f40: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9f50: 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
9f60: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
9f70: 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
9f80: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
9f90: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
9fa0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
9fb0: 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
9fc0: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9fd0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
9fe0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9ff0: 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
a000: 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
a010: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
a020: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
a030: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
a040: 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
a050: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
a060: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a070: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
a080: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
a090: 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  8, iHdrOff+4+nMa
a0a0: 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
a0b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a0c0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
a0d0: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
a0e0: 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67 65 72  er+20);.  pPager
a0f0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
a100: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20  ager->noSync;.. 
a110: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
a120: 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74   is in peristent
a130: 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74  -journal mode, t
a140: 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c  hen the physical
a150: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66   .  ** journal-f
a160: 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70  ile may extend p
a170: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
a180: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
a190: 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  l name.  ** and 
a1a0: 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63  8 bytes of magic
a1b0: 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74   data just writt
a1c0: 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20  en to the file. 
a1d0: 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61  This is .  ** da
a1e0: 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20  ngerous because 
a1f0: 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
a200: 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
a210: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c  al file.  ** wil
a220: 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f  l not be able to
a230: 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72   find the master
a240: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f  -journal name to
a250: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
a260: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
a270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
a280: 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ot. .  **.  ** E
a290: 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20  asiest thing to 
a2a0: 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61  do in this scena
a2b0: 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61  rio is to trunca
a2c0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  te the journal .
a2d0: 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65    ** file to the
a2e0: 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a   required size..
a2f0: 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49    */ .  if( SQLI
a300: 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c  TE_OK==(rc = sql
a310: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
a320: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e  Pager->jfd, &jrn
a330: 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72  lSize)).   && jr
a340: 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a  nlSize>pPager->j
a350: 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20  ournalOff.  ){. 
a360: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a370: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
a380: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
a390: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a  ournalOff);.  }.
a3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a3b0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
a3c0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
a3d0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
a3e0: 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74 75 72  ge number. Retur
a3f0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
a400: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
a410: 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75 65 73  LL if the reques
a420: 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
a430: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 6d  .** already in m
a440: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
a450: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
a460: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
a470: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
a480: 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
a4b0: 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20  lue */..  /* It 
a4c0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
a4d0: 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20 50 63  for a call to Pc
a4e0: 61 63 68 65 46 65 74 63 68 28 29 20 77 69 74 68  acheFetch() with
a4f0: 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30 20 74   createFlag==0 t
a500: 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e  o.  ** fail, sin
a510: 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f  ce no attempt to
a520: 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69   allocate dynami
a530: 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  c memory will be
a540: 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76   made..  */.  (v
a550: 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61 63 68  oid)sqlite3Pcach
a560: 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
a570: 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
a580: 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70   &p);.  return p
a590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ;.}../*.** Unles
a5a0: 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  s the pager is i
a5b0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 64  n error-state, d
a5c0: 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65  iscard all in-me
a5d0: 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66 0a 2a  mory pages. If.*
a5e0: 2a 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  * the pager is i
a5f0: 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74  n error-state, t
a600: 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73  hen this call is
a610: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
a620: 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20 77 65  TODO: Why can we
a630: 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65 20 70   not reset the p
a640: 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20 65 72  ager while in er
a650: 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74  ror state?.*/.st
a660: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
a670: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
a680: 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51 4c 49  ger){.  if( SQLI
a690: 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65  TE_OK==pPager->e
a6a0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  rrCode ){.    sq
a6b0: 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
a6c0: 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
a6d0: 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  up);.    sqlite3
a6e0: 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
a6f0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
a700: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
a710: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Valid = 0;.  }.}
a720: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
a730: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
a740: 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
a750: 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  int[] array and 
a760: 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65  set both.** Page
a770: 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64  r.aSavepoint and
a780: 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e   Pager.nSavepoin
a790: 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65  t to zero. Close
a7a0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
a7b0: 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65  .** if it is ope
a7c0: 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  n and the pager 
a7d0: 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  is not in exclus
a7e0: 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ive mode..*/.sta
a7f0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a800: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61  AllSavepoints(Pa
a810: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a820: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
a830: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
a840: 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  r for looping th
a850: 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76  rough Pager.aSav
a860: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28  epoint */.  for(
a870: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
a880: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
a890: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  +){.    sqlite3B
a8a0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
a8b0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
a8c0: 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
a8d0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
a8e0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
a8f0: 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 49 73  ode || sqlite3Is
a900: 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
a910: 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
a920: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
a930: 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
a940: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
a950: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
a960: 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
a970: 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
a980: 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
a990: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
a9a0: 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
a9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a9c0: 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
a9d0: 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
a9e0: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
a9f0: 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
aa00: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
aa10: 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
aa20: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
aa30: 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
aa40: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
aa50: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
aa60: 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
aa70: 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
aa80: 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
aa90: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
aaa0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
aad0: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
aae0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
aaf0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
ab00: 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
ab10: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
ab20: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
ab30: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
ab40: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
ab50: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
ab60: 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
ab70: 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
ab80: 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
ab90: 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
aba0: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
abb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
abc0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
abd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
abe0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
abf0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
ac00: 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
ac10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ac20: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
ac30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
ac40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ac50: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
ac60: 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78  ager.** is in ex
ac70: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a  clusive mode..**
ac80: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
ac90: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
aca0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69   error state, di
acb0: 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
acc0: 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61  ts of .** the ca
acd0: 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  che and reset th
ace0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
acf0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
ad00: 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  . If there is.**
ad10: 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
ad20: 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  -file, then the 
ad30: 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72  next time a shar
ad40: 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ed-lock is obtai
ad50: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61  ned.** on the pa
ad60: 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69  ger file (by thi
ad70: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
ad80: 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c  rocess), it will
ad90: 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61   be.** treated a
ada0: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
adb0: 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  and rolled back.
adc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
add0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
ade0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
adf0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
ae00: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
ae10: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae30: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
ae40: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63  .    /* Always c
ae50: 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
ae60: 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
ae70: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
ae80: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74   lock..    ** Ot
ae90: 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72  herwise, another
aea0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
aeb0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
aec0: 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 2a  lete might.    *
aed0: 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * delete the fil
aee0: 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  e out from under
aef0: 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
af00: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
af10: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
af20: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
af30: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
af40: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
af50: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
af60: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  l = 0;.    relea
af70: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
af80: 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
af90: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
afa0: 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f  unlocked, somebo
afb0: 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20 63 68  dy else might ch
afc0: 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20 20 20  ange it. The.   
afd0: 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f 72 65   ** values store
afe0: 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  d in Pager.dbSiz
aff0: 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62 65 63  e etc. might bec
b000: 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66 0a 20  ome invalid if. 
b010: 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70 70 65     ** this happe
b020: 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c 6c 79  ns. TODO: Really
b030: 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74 20 6e  , this doesn't n
b040: 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
b050: 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c 20 74  d.    ** until t
b060: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
b070: 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20 69 6e  r check fails in
b080: 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   PagerSharedLock
b090: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ()..    */.    p
b0a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
b0b0: 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20  id = 0;..    rc 
b0c0: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
b0d0: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
b0e0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
b0f0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
b100: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d  Code = rc;.    }
b110: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
b120: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
b130: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66  ger))..    /* If
b140: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
b150: 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
b160: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b170: 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
b180: 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  .    ** trusted.
b190: 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61   Now that the pa
b1a0: 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ger file is unlo
b1b0: 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e  cked, the conten
b1c0: 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
b1d0: 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
b1e0: 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20  scarded and the 
b1f0: 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c  error code safel
b200: 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  y cleared..    *
b210: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
b220: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b230: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b240: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b250: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b260: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b270: 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72     }.      pager
b280: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
b290: 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
b2a0: 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
b2b0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ne = 0;.    pPag
b2c0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
b2d0: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 7d 0a  R_UNLOCK;.  }.}.
b2e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b2f0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63  tion should be c
b300: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f  alled when an IO
b310: 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20  ERR, CORRUPT or 
b320: 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61  FULL error.** ma
b330: 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e  y have occurred.
b340: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
b350: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
b360: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a   to the pager .*
b370: 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  * structure, the
b380: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
b390: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
b3a0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
b3b0: 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66   pager .** API f
b3c0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c  unction. The val
b3d0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
b3e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
b3f0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  ond argument .**
b400: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
b410: 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n. .**.** If the
b420: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b430: 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   is SQLITE_IOERR
b440: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
b450: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  , or SQLITE_FULL
b460: 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65  .** the error be
b470: 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74  comes persistent
b480: 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73  . Until the pers
b490: 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63  isten error is c
b4a0: 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65  leared,.** subse
b4b0: 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20  quent API calls 
b4c0: 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69  on this Pager wi
b4d0: 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
b4e0: 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a  eturn the same .
b4f0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  ** error code..*
b500: 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e  *.** A persisten
b510: 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65  t error indicate
b520: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
b530: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b540: 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f  -cache .** canno
b550: 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68  t be trusted. Th
b560: 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20  is state can be 
b570: 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c  cleared by compl
b580: 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67  etely discarding
b590: 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74   .** the content
b5a0: 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
b5b0: 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73  ache. If a trans
b5c0: 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76  action was activ
b5d0: 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65  e when.** the pe
b5e0: 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f  rsistent error o
b5f0: 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
b600: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
b610: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
b620: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f  o be replayed to
b630: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   restore the con
b640: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
b650: 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69  abase file (as i
b660: 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68  f.** it were a h
b670: 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a  ot-journal)..*/.
b680: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b690: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
b6a0: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
b6b0: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
b6c0: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
b6d0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
b6e0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
b6f0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
b700: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
b710: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
b720: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
b730: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
b740: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
b750: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
b760: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
b770: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
b780: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
b790: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
b7a0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
b7b0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
b7c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
b7d0: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
b7e0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
b7f0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
b800: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b810: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
b820: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
b830: 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c  r is already unl
b840: 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65  ocked, call page
b850: 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74  r_unlock() now t
b860: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72  o.      ** clear
b870: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b880: 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74   and ensure that
b890: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b8a0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f   is .      ** co
b8b0: 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
b8c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
b8d0: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
b8e0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
b8f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b900: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
b910: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
b920: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
b930: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
b940: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
b950: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
b960: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
b970: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
b980: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
b990: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
b9a0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
b9b0: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
b9c0: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
b9d0: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
b9e0: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
b9f0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
ba00: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
ba10: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
ba20: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
ba30: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
ba40: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
ba50: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
ba60: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
ba70: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
ba80: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
ba90: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
baa0: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
bab0: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
bac0: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
bad0: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
bae0: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
baf0: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
bb00: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
bb10: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
bb20: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
bb30: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
bb40: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
bb50: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
bb60: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
bb70: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
bb80: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
bb90: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
bba0: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
bbb0: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
bbc0: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
bbd0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
bbe0: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
bbf0: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
bc00: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
bc10: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
bc20: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
bc30: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
bc40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
bc50: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
bc60: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
bc70: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
bc80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
bc90: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
bca0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
bcb0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
bcc0: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
bcd0: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
bce0: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
bcf0: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
bd00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bd10: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
bd20: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
bd30: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
bd40: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
bd50: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
bd60: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
bd70: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
bd80: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
bd90: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
bda0: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
bdb0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
bdc0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
bdd0: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
bde0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bdf0: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
be00: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
be10: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
be20: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
be30: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
be40: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
be50: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
be60: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
be70: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
be80: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
be90: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
bea0: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
beb0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
bec0: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
bed0: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
bee0: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
bef0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
bf00: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
bf10: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
bf20: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
bf30: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
bf40: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
bf50: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
bf60: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
bf70: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
bf80: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
bf90: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
bfa0: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
bfb0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
bfc0: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
bfd0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
bfe0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
bff0: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
c000: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
c010: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
c020: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
c030: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
c040: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
c050: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
c060: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
c070: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
c080: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
c090: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
c0a0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
c0b0: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
c0c0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
c0d0: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
c0e0: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
c0f0: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
c100: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
c110: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
c120: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
c130: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
c140: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
c150: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
c160: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
c170: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
c180: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
c190: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
c1a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c1b0: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
c1c0: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
c1d0: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
c1e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
c1f0: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
c200: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
c210: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
c220: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
c230: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
c240: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
c250: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
c260: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
c270: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
c280: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
c290: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
c2a0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
c2b0: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
c2c0: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
c2d0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
c2e0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
c2f0: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
c300: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
c310: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c320: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
c330: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
c340: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
c350: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
c360: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
c370: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c380: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
c390: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
c3a0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
c3b0: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
c3c0: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
c3d0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
c3e0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
c3f0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
c400: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c410: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
c420: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
c430: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
c440: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
c450: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
c460: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
c470: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
c480: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c490: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c4a0: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
c4b0: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
c4c0: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
c4d0: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
c4e0: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
c4f0: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
c500: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
c510: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
c520: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c530: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
c540: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
c550: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c560: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
c570: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
c580: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
c590: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c5a0: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
c5b0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
c5c0: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
c5d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
c5e0: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
c5f0: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
c600: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
c610: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c620: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
c630: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
c640: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
c650: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c660: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
c670: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
c680: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
c690: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
c6a0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
c6b0: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
c6c0: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
c6d0: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
c6e0: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
c6f0: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
c700: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
c710: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c720: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c730: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c740: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
c750: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
c760: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c770: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c780: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
c790: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
c7a0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
c7b0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
c7c0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c7d0: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
c7e0: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
c7f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
c800: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
c810: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
c820: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c830: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
c840: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
c850: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
c860: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
c870: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
c880: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
c890: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
c8a0: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20  ger->jfd) ){..  
c8b0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65 72 65    /* TODO: There
c8c0: 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68 65 72  's a problem her
c8d0: 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 66  e if a journal-f
c8e0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 69  ile was opened i
c8f0: 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a 2a 20  n MEMORY.    ** 
c900: 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20 74 68  mode and then th
c910: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
c920: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 52 55  s changed to TRU
c930: 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53 54  NCATE or PERSIST
c940: 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  .    ** during t
c950: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
c960: 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75 6c 64  This code should
c970: 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
c980: 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74 68 61  ssume.    ** tha
c990: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  t the journal mo
c9a0: 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  de has not chang
c9b0: 65 64 20 73 69 6e 63 65 20 74 68 65 20 74 72 61  ed since the tra
c9c0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 20  nsaction was.   
c9d0: 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41 6e 64   ** started. And
c9e0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
c9f0: 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 20 66  rJournalMode() f
ca00: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
ca10: 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 64  e.    ** changed
ca20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
ca30: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
ca40: 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ase too..    */.
ca50: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
ca60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
ca70: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
ca80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ca90: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
caa0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
cab0: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
cac0: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
cad0: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
cae0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
caf0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
cb00: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
cb10: 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d        if( !isMem
cb20: 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  oryJournal ){.  
cb30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
cb40: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
cb50: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
cb60: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
cb70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
cb80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
cb90: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
cba0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
cbb0: 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  CATE ){.      if
cbc0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cbd0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lOff==0 ){.     
cbe0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
cbf0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
cc00: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
cc10: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
cc20: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
cc30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
cc40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cc50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cc60: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cc70: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cc80: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78  e if( pPager->ex
cc90: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
cca0: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
ccb0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ccc0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
ccd0: 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  IST.    ){.     
cce0: 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
ccf0: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
cd00: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
cd10: 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
cd20: 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50  r, rc);.      pP
cd30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cd40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cd50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cd60: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
cd70: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
cd80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cd90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
cda0: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 29  NALMODE_DELETE )
cdb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
cdc0: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
cdd0: 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
cde0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
cdf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ce00: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
ce10: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
ce20: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
ce30: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ce40: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
ce50: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
ce60: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
ce70: 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
ce80: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
ce90: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
cea0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71  ;.#endif..    sq
ceb0: 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
cec0: 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
ced0: 63 68 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  che);.    sqlite
cee0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
cef0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
cf00: 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
cf10: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
cf20: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
cf30: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28   = 0;.  }..  if(
cf40: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
cf50: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
cf60: 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  c2 = osUnlock(pP
cf70: 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
cf80: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
cf90: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
cfa0: 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 50  R_SHARED;.    pP
cfb0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
cfc0: 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  tDone = 0;.  }el
cfd0: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
cfe0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
cff0: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
d000: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
d010: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
d020: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
d030: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
d040: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
d050: 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
d060: 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  fied = 0;..  /* 
d070: 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f 70  TODO: Is this op
d080: 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74 68  timal? Why is th
d090: 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c 69  e db size invali
d0a0: 64 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a 2a  dated here .  **
d0b0: 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   when the databa
d0c0: 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 75  se file is not u
d0d0: 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50  nlocked? */.  pP
d0e0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
d0f0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
d100: 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
d110: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
d120: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
d130: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
d140: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
d150: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  zeValid = 0;.  }
d160: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
d170: 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
d180: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
d190: 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74  meter aData must
d1a0: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
d1b0: 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61  er of pPager->pa
d1c0: 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20  geSize bytes.** 
d1d0: 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65  of data. Compute
d1e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
d1f0: 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74  ecksum based ont
d200: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
d210: 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66   the .** page of
d220: 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75   data and the cu
d230: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70  rrent value of p
d240: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
d250: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
d260: 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
d270: 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c  sum. It is reall
d280: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
d290: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
d2a0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28   initial value (
d2b0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
d2c0: 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30  t) and every 200
d2d0: 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  th byte.** of th
d2e0: 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61  e page data, sta
d2f0: 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20  rting with byte 
d300: 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e  offset (pPager->
d310: 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a  pageSize%200)..*
d320: 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69  * Each byte is i
d330: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e  nterpreted as an
d340: 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20   8-bit unsigned 
d350: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43  integer..**.** C
d360: 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d  hanging the form
d370: 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  ula used to comp
d380: 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75  ute this checksu
d390: 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a  m results in an.
d3a0: 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  ** incompatible 
d3b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
d3c0: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f  mat..**.** If jo
d3d0: 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  urnal corruption
d3e0: 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
d3f0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
d400: 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
d410: 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20  .** scenario is 
d420: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
d430: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
d440: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
d450: 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20  changed. .** It 
d460: 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  is much less lik
d470: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
d480: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
d490: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
d4a0: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
d4b0: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
d4c0: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
d4d0: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
d4e0: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
d4f0: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
d500: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
d510: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
d520: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
d530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
d540: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
d550: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
d560: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
d570: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
d580: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  r->cksumInit;   
d590: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
d5a0: 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72  m value to retur
d5b0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70  n */.  int i = p
d5c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
d5d0: 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  200;          /*
d5e0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
d5f0: 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b  .  while( i>0 ){
d600: 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44  .    cksum += aD
d610: 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d  ata[i];.    i -=
d620: 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   200;.  }.  retu
d630: 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a  rn cksum;.}../*.
d640: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
d650: 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
d660: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
d670: 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
d680: 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
d690: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
d6a0: 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
d6b0: 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
d6c0: 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
d6d0: 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
d6e0: 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
d6f0: 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
d700: 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
d710: 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
d720: 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
d730: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
d740: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
d750: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61  ..**.** The isMa
d760: 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74  inJrnl flag is t
d770: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74  rue if this is t
d780: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
d790: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
d7a0: 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74  false for the st
d7b0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
d7c0: 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62    The main rollb
d7d0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
d7e0: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  .** checksums - 
d7f0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d800: 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a  urnal does not..
d810: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
d820: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
d830: 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
d840: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
d850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
d860: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
d870: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
d880: 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
d890: 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
d8a0: 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
d8b0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
d8c0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
d8d0: 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
d8e0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
d8f0: 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
d900: 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
d910: 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
d920: 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
d930: 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
d940: 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
d950: 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
d960: 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
d970: 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
d980: 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
d990: 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
d9a0: 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
d9b0: 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
d9c0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
d9d0: 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
d9e0: 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
d9f0: 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
da00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
da10: 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
da20: 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
da30: 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
da40: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
da50: 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
da60: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
da70: 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
da80: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
da90: 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
daa0: 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
dab0: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
dac0: 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
dad0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
dae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
daf0: 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
db00: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
db10: 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
db20: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
db30: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
db40: 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
db50: 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
db60: 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
db70: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
db80: 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
db90: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
dba0: 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
dbb0: 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
dbc0: 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
dbd0: 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
dbe0: 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
dbf0: 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
dc00: 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
dc10: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
dc20: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
dc30: 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
dc40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
dc50: 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
dc60: 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
dc70: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
dc80: 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
dc90: 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
dca0: 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
dcb0: 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
dcc0: 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
dcd0: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
dce0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
dcf0: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dd00: 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
dd10: 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
dd20: 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
dd30: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
dd40: 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
dd50: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
dd60: 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
dd70: 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
dd80: 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
dd90: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
dda0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
ddb0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
ddc0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dde0: 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
ddf0: 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
de00: 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20  int isMainJrnl, 
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de20: 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e   1 -> main journ
de30: 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75  al. 0 -> sub-jou
de40: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  rnal. */.  int i
de50: 73 55 6e 73 79 6e 63 2c 20 20 20 20 20 20 20 20  sUnsync,        
de60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
de70: 20 69 66 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   if reading from
de80: 20 75 6e 73 79 6e 63 65 64 20 6d 61 69 6e 20 6a   unsynced main j
de90: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
dea0: 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20  *pOffset,       
deb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
dec0: 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f  set of record to
ded0: 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69   playback */.  i
dee0: 6e 74 20 69 73 53 61 76 65 70 6e 74 2c 20 20 20  nt isSavepnt,   
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df00: 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70  True for a savep
df10: 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  oint rollback */
df20: 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
df50: 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
df60: 65 64 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ed back */.){.  
df70: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
df80: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
df90: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
dfa0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
dfb0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
dfc0: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dfe0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
dff0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
e000: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
e010: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
e020: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
e030: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
e040: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
e050: 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20   u8 *aData;     
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e070: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
e080: 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
e090: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
e0a0: 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
e0b0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
e0c0: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
e0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e0e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69  */..  assert( (i
e0f0: 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30  sMainJrnl&~1)==0
e100: 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61   );      /* isMa
e110: 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31  inJrnl is 0 or 1
e120: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69   */.  assert( (i
e130: 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20  sSavepnt&~1)==0 
e140: 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61  );       /* isSa
e150: 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20  vepnt is 0 or 1 
e160: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d  */.  assert( isM
e170: 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65  ainJrnl || pDone
e180: 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65   );     /* pDone
e190: 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20   always used on 
e1a0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
e1b0: 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
e1c0: 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20  pnt || pDone==0 
e1d0: 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65  );   /* pDone ne
e1e0: 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d  ver used on non-
e1f0: 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20  savepoint */..  
e200: 61 44 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61  aData = (u8*)pPa
e210: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
e220: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
e230: 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
e240: 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
e250: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
e260: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a  n allocated */..
e270: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
e280: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
e290: 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
e2a0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
e2b0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
e2c0: 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
e2d0: 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
e2e0: 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
e2f0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
e300: 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
e310: 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
e320: 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
e330: 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
e340: 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
e350: 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
e360: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e370: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
e380: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
e390: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
e3a0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
e3b0: 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20  (*pOffset)+4);. 
e3c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e3d0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
e3e0: 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50    *pOffset += pP
e3f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
e400: 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a   4 + isMainJrnl*
e410: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
e420: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
e430: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
e440: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
e450: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
e460: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
e470: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
e480: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
e490: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
e4a0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
e4b0: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
e4c0: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
e4d0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
e4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
e4f0: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
e500: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
e510: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
e520: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
e530: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
e540: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
e550: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
e560: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
e570: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e580: 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20  !isSavepnt );.  
e590: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e5a0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
e5b0: 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
e5c0: 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
e5d0: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
e5e0: 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
e5f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e600: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
e610: 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
e620: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
e630: 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29  (jfd, (*pOffset)
e640: 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  -4, &cksum);.   
e650: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
e660: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73   rc;.    if( !is
e670: 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
e680: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
e690: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
e6a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e6b0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
e6c0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65    }..  if( pDone
e6d0: 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
e6e0: 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
e6f0: 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
e700: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
e710: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
e720: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
e730: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
e740: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
e750: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
e760: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
e770: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e780: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
e790: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
e7a0: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
e7b0: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
e7c0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
e7d0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
e7e0: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
e7f0: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
e800: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
e810: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
e820: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
e830: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
e840: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
e850: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
e860: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
e870: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
e880: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
e890: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
e8a0: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
e8b0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
e8c0: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
e8d0: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
e8e0: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
e8f0: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
e900: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
e910: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
e920: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
e930: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
e940: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
e950: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
e960: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
e970: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
e980: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
e990: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
e9a0: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
e9b0: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
e9c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
e9d0: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
e9e0: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
e9f0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
ea00: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
ea10: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
ea20: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
ea30: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
ea40: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
ea50: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
ea60: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ea70: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
ea80: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
ea90: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
eaa0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
eab0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
eac0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
ead0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
eae0: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
eaf0: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
eb00: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
eb10: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
eb20: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
eb30: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
eb40: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
eb50: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
eb60: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
eb70: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
eb80: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
eb90: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
eba0: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
ebb0: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
ebc0: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
ebd0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
ebe0: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
ebf0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
ec00: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
ec10: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
ec20: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
ec30: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
ec40: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
ec50: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
ec60: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
ec70: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
ec80: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
ec90: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
eca0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
ecb0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
ecc0: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
ecd0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
ece0: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
ecf0: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
ed00: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
ed10: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
ed20: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
ed30: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
ed40: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
ed50: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
ed60: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
ed70: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
ed80: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
ed90: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
eda0: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
edb0: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
edc0: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
edd0: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
ede0: 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
edf0: 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
ee00: 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
ee10: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
ee20: 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
ee30: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
ee40: 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
ee50: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
ee60: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
ee70: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
ee80: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
ee90: 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
eea0: 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
eeb0: 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
eec0: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
eed0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
eee0: 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gno);.  assert( 
eef0: 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
ef00: 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
ef10: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
ef20: 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25   %d hash(%08x) %
ef30: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
ef40: 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
ef50: 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
ef60: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
ef70: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61  r->pageSize, aDa
ef80: 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ta),.           
ef90: 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
efa0: 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
efb0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
efc0: 29 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65  ));.  if( (pPage
efd0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
efe0: 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26  EXCLUSIVE).   &&
eff0: 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28   (pPg==0 || 0==(
f000: 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
f010: 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20 20  _NEED_SYNC)).   
f020: 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
f030: 2d 3e 66 64 29 0a 20 20 20 26 26 20 21 69 73 55  ->fd).   && !isU
f040: 6e 73 79 6e 63 0a 20 20 29 7b 0a 20 20 20 20 69  nsync.  ){.    i
f050: 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
f060: 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
f070: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
f080: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f090: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
f0a0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
f0b0: 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
f0c0: 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
f0d0: 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
f0e0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
f0f0: 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
f100: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f110: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
f120: 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
f130: 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
f140: 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
f150: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
f160: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
f170: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
f180: 6b 75 70 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61  kup, pgno, aData
f190: 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  );.      CODEC1(
f1a0: 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
f1b0: 67 6e 6f 2c 20 30 2c 20 72 63 3d 53 51 4c 49 54  gno, 0, rc=SQLIT
f1c0: 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 7d 0a  E_NOMEM);.    }.
f1d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
f1e0: 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
f1f0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
f200: 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
f210: 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
f220: 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
f230: 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
f240: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
f250: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
f260: 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
f270: 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
f280: 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
f290: 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
f2a0: 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
f2b0: 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
f2c0: 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
f2d0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
f2e0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
f2f0: 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
f300: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
f310: 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
f320: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f330: 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
f340: 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
f350: 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
f360: 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
f370: 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
f380: 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
f390: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
f3a0: 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
f3b0: 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
f3c0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
f3d0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
f3e0: 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
f3f0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
f400: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
f410: 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
f420: 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
f430: 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
f440: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
f450: 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
f460: 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
f470: 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
f480: 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
f490: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
f4a0: 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
f4b0: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
f4c0: 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
f4d0: 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
f4e0: 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
f4f0: 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
f500: 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
f510: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
f520: 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
f530: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
f540: 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
f550: 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
f560: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
f570: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28  vepnt );.    if(
f580: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
f590: 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
f5a0: 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
f5b0: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
f5c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f5d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
f5e0: 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
f5f0: 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
f600: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
f610: 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
f620: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
f630: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
f640: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
f650: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
f660: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
f670: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
f680: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
f690: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
f6a0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
f6b0: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
f6c0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
f6d0: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
f6e0: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
f6f0: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
f700: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
f710: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
f720: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
f730: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
f740: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
f750: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
f760: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
f770: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
f780: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
f790: 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
f7a0: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
f7b0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
f7c0: 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
f7d0: 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
f7e0: 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
f7f0: 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
f800: 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
f810: 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
f820: 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
f830: 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
f840: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
f850: 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
f860: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
f870: 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
f880: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
f890: 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
f8a0: 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
f8b0: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
f8c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
f8d0: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
f8e0: 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
f8f0: 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
f900: 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
f910: 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
f920: 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
f930: 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
f940: 6f 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  o the..      **.
f950: 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
f960: 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  s one exception 
f970: 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66  to this rule. If
f980: 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
f990: 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20  ng rolled.      
f9a0: 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20  ** back as part 
f9b0: 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28  of a savepoint (
f9c0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f  or statement) ro
f9d0: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a  llback from an .
f9e0: 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65        ** unsynce
f9f0: 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
fa00: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
fa10: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e  le, then it is n
fa20: 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  ot safe.      **
fa30: 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67   to mark the pag
fa40: 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73  e as clean. This
fa50: 20 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b   is because mark
fa60: 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a  ing the page as.
fa70: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77        ** clean w
fa80: 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ill clear the PG
fa90: 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
faa0: 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61  ag. Since the pa
fab0: 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ge is.      ** a
fac0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
fad0: 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f  urnal file (reco
fae0: 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49  rded in Pager.pI
faf0: 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20  nJournal) and.  
fb00: 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52      ** the PGHDR
fb10: 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
fb20: 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74  is cleared, if t
fb30: 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
fb40: 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61  en to.      ** a
fb50: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
fb60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
fb70: 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20   will be marked 
fb80: 61 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20  as dirty but.   
fb90: 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
fba0: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77  NEED_SYNC flag w
fbb0: 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20  ill not be set. 
fbc0: 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f  It could then po
fbd0: 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20  tentially.      
fbe0: 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  ** be written ou
fbf0: 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
fc00: 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
fc10: 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
fc20: 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  .      ** segmen
fc30: 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20  t is synced. If 
fc40: 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64  a crash occurs d
fc50: 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69  uring or followi
fc60: 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a  ng this,.      *
fc70: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  * database corru
fc80: 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e  ption may ensue.
fc90: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
fca0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
fcb0: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
fcc0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
fcd0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
fce0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
fcf0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
fd00: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
fd10: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
fd20: 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
fd30: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
fd40: 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
fd50: 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
fd60: 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
fd70: 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
fd80: 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
fd90: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
fda0: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
fdb0: 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
fdc0: 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
fdd0: 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
fde0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
fdf0: 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
fe00: 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
fe10: 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
fe20: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
fe30: 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
fe40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
fe50: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
fe60: 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
fe70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fe80: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
fe90: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
fea0: 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45  (SQLITE_COVERAGE
feb0: 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _TEST)./*.** Thi
fec0: 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
fed0: 61 68 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6d  ahead into the m
fee0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
fef0: 20 61 6e 64 20 64 65 74 65 72 6d 69 6e 65 73 0a   and determines.
ff00: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
ff10: 74 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72  t the next recor
ff20: 64 20 28 74 68 65 20 72 65 63 6f 72 64 20 74 68  d (the record th
ff30: 61 74 20 62 65 67 69 6e 73 20 61 74 20 66 69 6c  at begins at fil
ff40: 65 0a 2a 2a 20 6f 66 66 73 65 74 20 70 50 61 67  e.** offset pPag
ff50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
ff60: 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  is a well-formed
ff70: 20 70 61 67 65 20 72 65 63 6f 72 64 20 63 6f 6e   page record con
ff80: 73 69 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20  sisting.** of a 
ff90: 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65  valid page numbe
ffa0: 72 2c 20 70 50 61 67 65 2d 3e 70 61 67 65 53 69  r, pPage->pageSi
ffb0: 7a 65 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74  ze bytes of cont
ffc0: 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a  ent, followed.**
ffd0: 20 62 79 20 61 20 76 61 6c 69 64 20 63 68 65 63   by a valid chec
ffe0: 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ksum..**.** The 
fff0: 70 61 67 65 72 20 6e 65 76 65 72 20 6e 65 65 64  pager never need
10000 73 20 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69  s to know this i
10010 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 20 69 74  n order to do it
10020 73 20 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a  s job.   This.**
10030 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
10040 20 75 73 65 64 20 66 72 6f 6d 20 77 69 74 68 69   used from withi
10050 6e 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74  n assert() and t
10060 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73  estcase() macros
10070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10080 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
10090 50 61 67 65 49 73 56 61 6c 69 64 28 50 61 67 65  PageIsValid(Page
100a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
100b0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
100c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
100d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
100e0 65 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  e */.  u32 cksum
100f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
10100 68 65 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  he page checksum
10110 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
10120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10130 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 72  turn code from r
10140 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a  ead operations *
10150 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
10160 20 2a 66 64 3b 20 20 20 20 2f 2a 20 54 68 65 20   *fd;    /* The 
10170 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10180 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 61 72  from which we ar
10190 65 20 72 65 61 64 69 6e 67 20 2a 2f 0a 20 20 75  e reading */.  u
101a0 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  8 *aData;       
101b0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
101c0 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20  f the page */.. 
101d0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
101e0 65 20 6e 75 6d 62 65 72 20 68 65 61 64 65 72 20  e number header 
101f0 2a 2f 0a 20 20 66 64 20 3d 20 70 50 61 67 65 72  */.  fd = pPager
10200 2d 3e 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  ->jfd;.  rc = re
10210 61 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61  ad32bits(fd, pPa
10220 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
10230 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
10240 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
10250 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20  return 0; }     
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
10280 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70  O_TEST*/.  if( p
10290 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
102a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
102b0 61 67 65 72 29 20 29 7b 20 72 65 74 75 72 6e 20  ager) ){ return 
102c0 30 3b 20 7d 20 20 20 20 20 20 20 20 20 2f 2a 4e  0; }         /*N
102d0 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70  O_TEST*/.  if( p
102e0 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
102f0 2d 3e 64 62 53 69 7a 65 20 29 7b 20 72 65 74 75  ->dbSize ){ retu
10300 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
10310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
10320 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52  O_TEST*/..  /* R
10330 65 61 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ead the checksum
10340 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
10350 32 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72  2bits(fd, pPager
10360 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70 50 61  ->journalOff+pPa
10370 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
10380 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
10390 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
103a0 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
103b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
103d0 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20  NO_TEST*/..  /* 
103e0 52 65 61 64 20 74 68 65 20 64 61 74 61 20 61 6e  Read the data an
103f0 64 20 76 65 72 69 66 79 20 74 68 65 20 63 68 65  d verify the che
10400 63 6b 73 75 6d 20 2a 2f 0a 20 20 61 44 61 74 61  cksum */.  aData
10410 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e   = (u8*)pPager->
10420 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
10430 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
10440 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
10450 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
10460 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
10470 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
10480 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72  LITE_OK ){ retur
10490 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
104a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104b0 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
104c0 54 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 5f  T*/.  if( pager_
104d0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44  cksum(pPager, aD
104e0 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 20 72  ata)!=cksum ){ r
104f0 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
10500 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
10510 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 63 68 20  T*/..  /* Reach 
10520 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 6c 79 20  this point only 
10530 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 76  if the page is v
10540 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e  alid */.  return
10550 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
10560 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
10570 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
10580 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54  TE_COVERAGE_TEST
10590 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  ) */../*.** Para
105a0 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
105b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
105c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
105d0 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
105e0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
105f0 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
10600 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10610 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
10620 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
10630 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10640 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
10650 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
10660 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
10670 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
10680 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
10690 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75  t is..**.** Argu
106a0 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79  ment zMaster may
106b0 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e   point to Pager.
106c0 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68  pTmpSpace. So th
106d0 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  at buffer is not
106e0 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66   .** available f
106f0 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68  or use within th
10700 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
10710 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72  ** When a master
10720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
10730 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20   created, it is 
10740 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
10750 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  he names .** of 
10760 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64  all of its child
10770 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61   journals, one a
10780 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f  fter another, fo
10790 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38  rmatted as utf-8
107a0 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78   .** encoded tex
107b0 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61  t. The end of ea
107c0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
107d0 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20   file is marked 
107e0 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74  with a .** nul-t
107f0 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28  erminator byte (
10800 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20  0x00). i.e. the 
10810 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
10820 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
10830 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  nal.** file for 
10840 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
10850 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61  volving two data
10860 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a  bases might be:.
10870 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62  **.**   "/home/b
10880 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/a.db-journal
10890 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62  \x00/home/bill/b
108a0 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22  .db-journal\x00"
108b0 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20  .**.** A master 
108c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
108d0 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64   only be deleted
108e0 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73   once all of its
108f0 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e   child .** journ
10900 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f  als have been ro
10910 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
10920 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
10930 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  eads the content
10940 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  s of the master-
10950 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
10960 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  o .** memory and
10970 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65   loops through e
10980 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ach of the child
10990 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20   journal names. 
109a0 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c  For.** each chil
109b0 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68  d journal, it ch
109c0 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  ecks if:.**.**  
109d0 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
109e0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20  journal exists, 
109f0 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a  and if so.**   *
10a00 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
10a10 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61  urnal contains a
10a20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61   reference to ma
10a30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ster journal .**
10a40 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65       file zMaste
10a50 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69  r.**.** If a chi
10a60 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
10a70 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74  e found that mat
10a80 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65  ches both of the
10a90 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f   criteria.** abo
10aa0 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ve, this functio
10ab0 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75  n returns withou
10ac0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
10ad0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a  . Otherwise, if.
10ae0 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64  ** no such child
10af0 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
10b00 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73  found, file zMas
10b10 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66  ter is deleted f
10b20 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d  rom.** the file-
10b30 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c  system using sql
10b40 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
10b50 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
10b60 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73  rror within this
10b70 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72   function, an er
10b80 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
10b90 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75  rned. This.** fu
10ba0 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
10bb0 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69   memory by calli
10bc0 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  ng sqlite3Malloc
10bd0 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61  (). If an alloca
10be0 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  tion.** fails, S
10bf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
10c00 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
10c10 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20  se, if no IO or 
10c20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a  malloc errors .*
10c30 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  * occur, SQLITE_
10c40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
10c50 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73  **.** TODO: This
10c60 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
10c70 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f  tes a single blo
10c80 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  ck of memory to 
10c90 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69  load.** the enti
10ca0 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
10cb0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10cc0 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75  l file. This cou
10cd0 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c  ld be.** a coupl
10ce0 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f  e of kilobytes o
10cf0 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c  r so - potential
10d00 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ly larger than t
10d10 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65  he page .** size
10d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10d30 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
10d40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
10d50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
10d60 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
10d70 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
10d80 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
10d90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10da0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
10db0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
10dc0 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20  _file *pMaster; 
10dd0 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d     /* Malloc'd m
10de0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
10df0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
10e00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10e10 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20  *pJournal;   /* 
10e20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a  Malloc'd child-j
10e30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10e40 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  riptor */.  char
10e50 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
10e60 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
10e70 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
10e80 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
10e90 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
10ea0 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
10eb0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
10ec0 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
10ed0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
10ee0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
10ef0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
10f00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10f10 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
10f20 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
10f30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10f40 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
10f50 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
10f60 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10f70 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
10f80 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
10f90 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
10fa0 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
10fb0 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
10fc0 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
10fd0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
10fe0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
10ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11000 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
11010 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
11020 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
11030 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
11040 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
11050 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
11060 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
11070 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
11080 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
11090 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
110a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
110b0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
110c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
110d0 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
110e0 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
110f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11100 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
11110 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
11120 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
11130 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
11140 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
11150 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
11160 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
11170 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e  sterPtr = pVfs->
11180 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
11190 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
111a0 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
111b0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
111c0 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
111d0 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
111e0 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
111f0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
11200 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
11210 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
11220 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
11230 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
11240 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
11250 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
11260 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
11270 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
11280 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11290 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
112a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
112b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74  .    }.    zMast
112c0 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
112d0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
112e0 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20  ournal];.    rc 
112f0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
11300 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
11310 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
11320 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
11330 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
11340 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
11350 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
11360 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
11370 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
11380 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
11390 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
113a0 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
113b0 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  l ){.      int e
113c0 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20  xists;.      rc 
113d0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
113e0 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
113f0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
11400 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
11410 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11420 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11430 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
11440 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
11450 0a 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74  .      if( exist
11460 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  s ){.        /* 
11470 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
11480 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
11490 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
114a0 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
114b0 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
114c0 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
114d0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
114e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
114f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
11500 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
11510 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
11520 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11530 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
11540 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
11550 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
11560 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11570 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
11580 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
11590 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
115a0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
115b0 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
115c0 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
115d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
115e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
115f0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
11600 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
11610 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
11620 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
11630 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
11640 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
11650 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
11660 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11670 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
11680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
116a0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
116b0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
116c0 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
116d0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
116e0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
116f0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
11700 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
11710 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
11720 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
11730 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
11740 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11750 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
11760 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
11770 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
11780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
11790 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
117a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
117b0 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
117c0 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71    }.  .  rc = sq
117d0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
117e0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
117f0 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
11800 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
11810 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
11820 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
11830 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
11840 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
11850 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
11860 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
11870 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11880 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
11890 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
118a0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ee(pMaster);.  r
118b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
118c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
118d0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61  n is used to cha
118e0 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73  nge the actual s
118f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
11900 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20  ase .** file in 
11910 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e  the file-system.
11920 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65   This only happe
11930 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ns when committi
11940 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
11950 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20  ,.** or rolling 
11960 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
11970 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f  on (including ro
11980 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
11990 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a  -journal)..**.**
119a0 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   If the main dat
119b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
119c0 74 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78  t open, or an ex
119d0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
119e0 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69  not.** held, thi
119f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
11a00 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
11a10 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  , the size of th
11a20 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61  e file is.** cha
11a30 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
11a40 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
11a50 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
11a60 73 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a  s). If the file.
11a70 2a 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  ** on disk is cu
11a80 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
11a90 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
11aa0 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
11ab0 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
11ac0 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
11ad0 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
11ae0 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74  , it might might
11af0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
11b00 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
11b10 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
11b20 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
11b30 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
11b40 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
11b50 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
11b60 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
11b70 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
11b80 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
11b90 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
11ba0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
11bb0 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
11bc0 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
11bd0 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
11be0 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
11bf0 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
11c00 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
11c10 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
11c20 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
11c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11c40 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
11c50 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
11c60 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
11c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
11c80 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
11c90 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
11ca0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
11cb0 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
11cc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11cd0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
11ce0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11cf0 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
11d00 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
11d10 43 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65  CLUSIVE && isOpe
11d20 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
11d30 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
11d40 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
11d50 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
11d60 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
11d70 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
11d80 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
11d90 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11da0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
11db0 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
11dc0 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
11dd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
11de0 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
11df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11e00 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
11e10 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
11e20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
11e30 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
11e40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11e50 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
11e60 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
11e70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11e80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11e90 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
11ea0 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53  >fd, "", 1, newS
11eb0 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ize-1);.      }.
11ec0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
11ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11ee0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
11ef0 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
11f00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11f10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11f20 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
11f30 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
11f40 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
11f50 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
11f60 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
11f70 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
11f80 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
11f90 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
11fa0 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
11fb0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
11fc0 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
11fd0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73   will be used us
11fe0 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
11ff0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
12000 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
12010 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
12020 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
12030 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
12040 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
12050 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
12060 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
12070 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
12080 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
12090 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
120a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
120b0 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
120c0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
120d0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
120e0 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
120f0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
12100 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
12110 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
12120 6e 64 65 64 20 75 70 20 74 6f 20 35 31 32 20 69  nded up to 512 i
12130 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20  f.** it is less 
12140 74 68 61 6e 20 35 31 32 2c 20 6f 72 20 72 6f 75  than 512, or rou
12150 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
12160 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
12170 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
12180 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
12190 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  _SIZE..*/.static
121a0 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53   void setSectorS
121b0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
121c0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73  r){.  assert( is
121d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
121e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
121f0 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21  File );..  if( !
12200 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12210 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
12220 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
12230 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
12240 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
12250 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
12260 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
12270 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
12280 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
12290 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
122a0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
122b0 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
122c0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
122d0 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
122e0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
122f0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
12300 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
12310 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a  ctorSize<512 ){.
12320 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
12330 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
12340 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
12350 73 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  sectorSize>MAX_S
12360 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
12370 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
12380 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
12390 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  ;.    pPager->se
123a0 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53  ctorSize = MAX_S
123b0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
123c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
123d0 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
123e0 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
123f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12400 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
12410 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
12420 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
12430 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
12440 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
12450 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
12460 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
12470 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
12480 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
12490 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
124a0 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
124b0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
124c0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
124d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
124e0 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
124f0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
12500 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
12510 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
12520 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
12530 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
12540 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
12550 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
12560 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
12570 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
12580 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
12590 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
125a0 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
125b0 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
125c0 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
125d0 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
125e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
125f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
12600 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
12610 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
12620 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
12630 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
12640 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
12650 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
12660 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
12670 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
12680 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
12690 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
126a0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
126b0 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
126c0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
126d0 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
126e0 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20   case..**  (7)  
126f0 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
12700 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
12710 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
12720 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12730 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e  l.**       name.
12740 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20    The value may 
12750 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74  be zero (indicat
12760 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  e that there is 
12770 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  no master.**    
12780 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20     journal.).** 
12790 20 28 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66   (8)  N bytes of
127a0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
127b0 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e  nal name.  The n
127c0 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d  ame will be nul-
127d0 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20  terminated.**   
127e0 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65      and might be
127f0 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68   shorter than th
12800 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
12810 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66  m (5).  If the f
12820 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  irst byte.**    
12830 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69     of the name i
12840 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72  s \000 then ther
12850 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a  e is no master j
12860 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73  ournal.  The mas
12870 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
12880 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f  rnal name is sto
12890 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  red in UTF-8..**
128a0 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (9)  Zero or m
128b0 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
128c0 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
128d0 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
128e0 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
128f0 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
12900 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
12910 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
12920 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
12930 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
12940 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
12950 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
12960 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
12970 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 38 20  ean the first 8 
12980 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
12990 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
129a0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
129b0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
129c0 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  9th item..**.** 
129d0 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
129e0 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
129f0 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
12a00 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
12a10 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
12a20 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
12a30 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
12a40 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
12a50 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
12a60 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
12a70 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
12a80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12a90 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
12aa0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
12ab0 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
12ac0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
12ad0 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
12ae0 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
12af0 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
12b00 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12b10 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
12b20 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
12b30 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
12b40 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
12b50 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
12b60 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
12b70 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
12b80 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
12b90 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
12ba0 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
12bb0 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
12bc0 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
12bd0 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
12be0 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
12bf0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
12c00 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
12c10 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
12c20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
12c30 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
12c40 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
12c50 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
12c60 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
12c70 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
12c80 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
12c90 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
12ca0 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
12cb0 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
12cc0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
12cd0 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
12ce0 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
12cf0 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
12d00 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
12d10 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
12d20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
12d30 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
12d40 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
12d50 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
12d60 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
12d70 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
12d80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12d90 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
12da0 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
12db0 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
12dc0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
12dd0 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
12de0 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
12df0 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
12e00 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
12e10 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
12e20 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
12e30 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
12e40 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
12e50 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
12e60 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
12e70 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
12e80 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
12e90 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
12ea0 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
12eb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
12ec0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
12ed0 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
12ee0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
12ef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
12f00 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
12f10 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
12f20 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
12f30 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
12f40 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
12f50 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
12f60 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
12f70 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
12f80 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
12f90 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
12fa0 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
12fb0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
12fc0 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
12fd0 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
12fe0 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
12ff0 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
13000 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
13010 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
13020 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
13030 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
13040 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
13050 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
13060 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
13070 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
13080 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
13090 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
130a0 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
130b0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
130c0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
130d0 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
130e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
130f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13100 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
13110 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
13120 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13130 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
13140 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
13150 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
13160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
13170 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
13180 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
13190 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
131a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
131b0 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
131c0 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
131d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
131e0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
131f0 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
13200 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
13210 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
13220 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
13230 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
13240 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
13250 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
13260 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
13270 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
13280 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
13290 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
132a0 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
132b0 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
132c0 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
132d0 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
132e0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
132f0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
13300 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
13310 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
13320 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
13330 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
13340 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
13350 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13360 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
13370 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
13380 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
13390 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
133a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
133b0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
133c0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
133d0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
133e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
133f0 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
13400 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
13410 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
13420 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
13430 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
13440 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
13450 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
13460 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
13470 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
13480 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
13490 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
134a0 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
134b0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ed back..  **.  
134c0 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63  ** TODO: Technic
134d0 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ally the followi
134e0 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62  ng is an error b
134f0 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65  ecause it assume
13500 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66  s that.  ** buff
13510 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  er Pager.pTmpSpa
13520 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d  ce is (mxPathnam
13530 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61  e+1) bytes or la
13540 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a  rger. i.e. that.
13550 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61    ** (pPager->pa
13560 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72  geSize >= pPager
13570 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
13580 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f  me+1). Using os_
13590 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78  unix.c,.  **  mx
135a0 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c  Pathname is 512,
135b0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61   which is the sa
135c0 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75  me as the minimu
135d0 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75  m allowable valu
135e0 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53  e.  ** for pageS
135f0 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73  ize..  */.  zMas
13600 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
13610 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
13620 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
13630 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
13640 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
13650 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
13660 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  +1);.  if( rc==S
13670 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
13680 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  ter[0] ){.    rc
13690 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
136a0 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
136b0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
136c0 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
136d0 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30   }.  zMaster = 0
136e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
136f0 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b  TE_OK || !res ){
13700 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
13710 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
13720 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13730 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65   = 0;.  needPage
13740 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a  rReset = isHot;.
13750 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
13760 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
13770 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75  r when a readJou
13780 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20  rnalHdr() or .  
13790 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
137a0 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c  k_one_page() cal
137b0 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  l returns SQLITE
137c0 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
137d0 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72  rror .  ** occur
137e0 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  s. .  */.  while
137f0 28 20 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( 1 ){.    int i
13800 73 55 6e 73 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  sUnsync = 0;..  
13810 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
13820 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
13830 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
13840 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
13850 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
13860 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
13870 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
13880 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
13890 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
138a0 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
138b0 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
138c0 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
138d0 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
138e0 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
138f0 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
13900 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
13910 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
13920 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
13930 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
13940 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48  lHdr(pPager, isH
13950 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  ot, szJ, &nRec, 
13960 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
13970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13980 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
13990 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
139a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
139b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
139c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
139d0 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
139e0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
139f0 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
13a00 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
13a10 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
13a20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
13a30 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
13a40 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
13a50 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
13a60 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
13a70 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
13a80 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
13a90 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
13aa0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
13ab0 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
13ac0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
13ad0 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
13ae0 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
13af0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
13b00 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
13b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13b20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13b30 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
13b40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
13b50 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
13b60 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
13b70 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
13b80 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
13b90 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
13ba0 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
13bb0 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
13bc0 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
13bd0 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
13be0 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
13bf0 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
13c00 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
13c10 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
13c20 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
13c30 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
13c40 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
13c50 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
13c60 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
13c70 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
13c80 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
13c90 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
13ca0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
13cb0 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
13cc0 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
13cd0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
13ce0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
13cf0 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
13d00 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
13d10 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
13d20 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
13d30 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62  * When rolling b
13d40 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
13d50 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79  l, nRec==0 alway
13d60 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
13d70 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75   next.    ** chu
13d80 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nk of the journa
13d90 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20  l contains zero 
13da0 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c  pages to be roll
13db0 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20  ed back.  But.  
13dc0 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20    ** when doing 
13dd0 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74  a ROLLBACK and t
13de0 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b  he nRec==0 chunk
13df0 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75   is the last chu
13e00 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  nk in.    ** the
13e10 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61   journal, it mea
13e20 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ns that the jour
13e30 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
13e40 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20  n additional.   
13e50 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e   ** pages that n
13e60 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eed to be rolled
13e70 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74   back and that t
13e80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
13e90 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  es .    ** shoul
13ea0 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61  d be computed ba
13eb0 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  sed on the journ
13ec0 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20  al file size..  
13ed0 20 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73    */.    testcas
13ee0 65 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  e( nRec==0 && !i
13ef0 73 48 6f 74 0a 20 20 20 20 20 20 20 20 20 26 26  sHot.         &&
13f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f10 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
13f20 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61 67  SZ(pPager)!=pPag
13f30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
13f40 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a          && ((szJ
13f50 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
13f60 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
13f70 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e  _PG_SZ(pPager))>
13f80 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 61  0.         && pa
13f90 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61  gerNextJournalPa
13fa0 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65 72  geIsValid(pPager
13fb0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
13fc0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
13fd0 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
13fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
13ff0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
14000 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
14010 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
14020 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
14030 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
14040 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
14050 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
14060 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 73 55  ger));.      isU
14070 6e 73 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d  nsync = 1;.    }
14080 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
14090 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
140a0 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
140b0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
140c0 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
140d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
140e0 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
140f0 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
14100 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14110 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
14120 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
14130 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
14140 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
14150 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
14160 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
14170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14180 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
14190 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
141a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
141b0 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
141c0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
141d0 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
141e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
141f0 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
14200 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
14210 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
14220 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
14230 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
14240 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
14250 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
14260 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
14270 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
14280 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
14290 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
142a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
142b0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
142c0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
142d0 65 72 2c 31 2c 69 73 55 6e 73 79 6e 63 2c 26 70  er,1,isUnsync,&p
142e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
142f0 66 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  f,0,0);.      if
14300 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14310 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
14320 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
14330 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
14340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14350 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14360 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
14370 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
14380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
143a0 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
143b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
143c0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
143d0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
143e0 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
143f0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
14400 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14410 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
14420 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
14430 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
14440 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
14450 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
14460 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
14470 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
14480 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
14490 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
144a0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
144b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
144c0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
144d0 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
144e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
144f0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
14500 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
14510 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
14520 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
14530 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
14540 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
14550 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
14560 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
14570 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
14580 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
14590 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
145a0 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
145b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
145c0 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
145d0 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
145e0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
145f0 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
14600 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
14610 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
14620 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  dified..  */.  a
14630 73 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65  ssert(.    pPage
14640 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d  r->fd->pMethods=
14650 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65  =0 ||.    sqlite
14660 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
14670 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
14680 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
14690 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f  GED,0)>=SQLITE_O
146a0 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  K.  );..  /* If 
146b0 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
146c0 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
146d0 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
146e0 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
146f0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
14700 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
14710 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
14720 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
14730 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
14740 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
14750 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
14760 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
14770 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
14780 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
14790 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
147a0 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
147b0 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
147c0 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
147d0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
147e0 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
147f0 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
14800 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
14810 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
14820 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
14830 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
14840 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
14850 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
14860 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
14870 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
14880 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
14890 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
148a0 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
148b0 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
148c0 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
148d0 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
148e0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
148f0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
14900 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
14910 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
14920 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
14930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14940 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
14950 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
14960 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
14970 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
14980 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
14990 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
149a0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
149b0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
149c0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
149d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
149e0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
149f0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
14a00 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
14a10 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
14a20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14a30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
14a40 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
14a50 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
14a60 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
14a70 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
14a80 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
14a90 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
14aa0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
14ab0 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
14ac0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
14ad0 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
14ae0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
14af0 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
14b00 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
14b10 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
14b20 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
14b30 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14b40 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
14b50 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
14b60 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
14b70 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
14b80 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
14b90 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
14ba0 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
14bb0 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
14bc0 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74  a different sect
14bd0 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c  or size.  ** val
14be0 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
14bf0 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
14c00 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
14c10 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65  ss..  */.  setSe
14c20 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
14c30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14c40 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
14c50 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
14c60 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
14c70 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
14c80 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
14c90 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
14ca0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
14cb0 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
14cc0 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
14cd0 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
14ce0 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
14cf0 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
14d00 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
14d10 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
14d20 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
14d30 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
14d40 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
14d50 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
14d60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
14d70 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
14d80 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
14d90 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
14da0 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
14db0 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
14dc0 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
14dd0 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
14de0 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
14df0 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
14e00 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14e10 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
14e20 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
14e30 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
14e40 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
14e50 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
14e60 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
14e70 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14e80 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
14e90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
14ea0 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
14eb0 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
14ec0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14ed0 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
14ee0 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
14ef0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14f00 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
14f10 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
14f20 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
14f30 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
14f40 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
14f50 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
14f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
14f70 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
14f80 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
14f90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
14fa0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
14fb0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
14fc0 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
14fd0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14fe0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
14ff0 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
15000 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
15010 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
15020 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
15030 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
15040 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
15050 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
15060 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
15070 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
15080 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
15090 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
150a0 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
150b0 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
150c0 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
150d0 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
150e0 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
150f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
15100 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
15110 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
15120 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
15130 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
15140 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
15150 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
15160 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
15170 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
15180 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
15190 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
151a0 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
151b0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
151c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
151d0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
151e0 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
151f0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
15200 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
15210 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
15220 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
15230 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
15240 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
15250 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
15260 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
15270 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
15280 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
15290 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
152a0 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
152b0 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
152c0 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
152d0 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
152e0 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
152f0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
15300 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
15310 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15320 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
15330 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
15340 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
15350 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
15360 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
15370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15380 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
15390 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
153a0 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
153b0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
153c0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
153d0 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
153e0 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
153f0 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
15400 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15410 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
15420 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
15430 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
15440 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
15450 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
15460 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
15470 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
15480 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
15490 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
154a0 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76   Allocate a bitv
154b0 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f  ec to use to sto
154c0 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  re the set of pa
154d0 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
154e0 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
154f0 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65  int ){.    pDone
15500 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
15510 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e  Create(pSavepoin
15520 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69  t->nOrig);.    i
15530 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20  f( !pDone ){.   
15540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15550 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
15560 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
15570 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61  database size ba
15580 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ck to the value 
15590 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68  it was before th
155a0 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a  e savepoint .  *
155b0 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64  * being reverted
155c0 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a   was opened..  *
155d0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
155e0 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20  ze = pSavepoint 
155f0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  ? pSavepoint->nO
15600 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62  rig : pPager->db
15610 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  OrigSize;..  /* 
15620 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  Use pPager->jour
15630 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66  nalOff as the ef
15640 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
15650 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
15660 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
15670 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   The actual file
15680 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
15690 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20   than this in.  
156a0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
156b0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72  MODE_TRUNCATE or
156c0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
156d0 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74  DE_PERSIST.  But
156e0 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70   anything.  ** p
156f0 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ast pPager->jour
15700 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69  nalOff is off-li
15710 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f  mits to us..  */
15720 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
15730 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
15740 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
15750 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
15760 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
15770 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
15780 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
15790 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
157a0 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
157b0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
157c0 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
157d0 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
157e0 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
157f0 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
15800 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
15810 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
15820 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
15830 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
15840 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
15850 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
15860 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
15870 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
15880 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
15890 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
158a0 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
158b0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
158c0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
158d0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
158e0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
158f0 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
15900 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
15910 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
15920 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
15930 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
15940 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
15950 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
15960 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
15970 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
15980 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
15990 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
159a0 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61  ager, 1, 0, &pPa
159b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
159c0 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20   1, pDone);.    
159d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
159e0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
159f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
15a00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15a10 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
15a20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
15a30 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
15a40 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
15a50 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
15a60 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
15a70 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
15a80 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
15a90 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
15aa0 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
15ab0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
15ac0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
15ad0 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
15ae0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
15af0 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
15b00 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
15b10 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
15b20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
15b30 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
15b40 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
15b50 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
15b60 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
15b70 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15b80 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
15b90 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
15ba0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
15bb0 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
15bc0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
15bd0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
15be0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
15bf0 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
15c00 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
15c10 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
15c20 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
15c30 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
15c40 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
15c50 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
15c60 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
15c70 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
15c80 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
15c90 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
15ca0 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
15cb0 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
15cc0 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
15cd0 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
15ce0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
15cf0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
15d00 20 20 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a      assert( !(nJ
15d10 52 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  Rec==0.         
15d20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15d30 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
15d40 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50  R_SZ(pPager)!=pP
15d50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15d60 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73  .         && ((s
15d70 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
15d80 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
15d90 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
15da0 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  )>0.         && 
15db0 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c  pagerNextJournal
15dc0 50 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67  PageIsValid(pPag
15dd0 65 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  er)).    );.    
15de0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
15df0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
15e00 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
15e10 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
15e20 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
15e30 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
15e40 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
15e50 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
15e60 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
15e70 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
15e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
15e90 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
15ea0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
15eb0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
15ec0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
15ed0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
15ee0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
15ef0 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
15f00 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  0, &pPager->jour
15f10 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65  nalOff, 1, pDone
15f20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
15f30 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15f40 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73  DONE );.  }.  as
15f50 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
15f60 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
15f70 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29  ournalOff==szJ )
15f80 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
15f90 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
15fa0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
15fb0 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
15fc0 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
15fd0 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
15fe0 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
15ff0 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
16000 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
16010 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
16020 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
16030 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
16040 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
16050 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
16060 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32  point ){.    u32
16070 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
16080 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
16090 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  */.    i64 offse
160a0 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t = pSavepoint->
160b0 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  iSubRec*(4+pPage
160c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
160d0 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
160e0 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
160f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
16100 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
16110 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
16120 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
16130 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
16140 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
16150 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
16160 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
16170 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f 66 66  ager, 0, 0, &off
16180 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a  set, 1, pDone);.
16190 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
161a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
161b0 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E );.  }..  sqli
161c0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
161d0 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72  (pDone);.  if( r
161e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
161f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16200 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
16210 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16220 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
16230 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
16240 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
16250 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
16260 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lowed..*/.void s
16270 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
16280 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
16290 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
162a0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
162b0 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
162c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
162d0 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
162e0 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
162f0 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
16300 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
16310 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
16320 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
16330 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
16340 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
16350 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
16360 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
16370 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
16380 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
16390 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
163a0 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
163b0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
163c0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
163d0 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
163e0 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
163f0 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
16400 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
16410 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
16420 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
16430 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
16440 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
16450 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
16460 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16470 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
16480 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
16490 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
164a0 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
164b0 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
164c0 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
164d0 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
164e0 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
164f0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
16500 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
16510 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
16520 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
16530 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
16540 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
16550 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
16560 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
16570 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
16580 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
16590 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
165a0 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
165b0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
165c0 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
165d0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
165e0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
165f0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
16600 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
16610 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
16620 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
16630 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
16640 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
16650 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
16660 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
16670 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
16690 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
166a0 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
166b0 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
166c0 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
166d0 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
166e0 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
166f0 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
16700 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
16710 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
16720 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
16730 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
16740 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16750 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
16760 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
16770 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
16780 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
16790 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
167a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
167b0 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
167c0 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
167d0 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
167e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
167f0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
16800 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
16810 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
16820 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  Level(Pager *pPa
16830 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  ger, int level, 
16840 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b  int bFullFsync){
16850 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
16860 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c  c =  (level==1 |
16870 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
16880 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
16890 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28  er->fullSync = (
168a0 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
168b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
168c0 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  1:0;.  pPager->s
168d0 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75  ync_flags = (bFu
168e0 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53  llFsync?SQLITE_S
168f0 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f  YNC_FULL:SQLITE_
16900 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
16910 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
16920 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
16930 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e  dSync = 0;.}.#en
16940 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
16950 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
16960 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
16970 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
16980 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
16990 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
169a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
169b0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
169c0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
169d0 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
169e0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
169f0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
16a00 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
16a10 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
16a20 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
16a30 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
16a40 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
16a50 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
16a60 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
16a70 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
16a80 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
16a90 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
16aa0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
16ab0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
16ac0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
16ad0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
16ae0 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
16af0 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
16b00 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
16b10 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
16b20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
16b30 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
16b40 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
16b50 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
16b60 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
16b70 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
16b80 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
16b90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16ba0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
16bb0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
16bc0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16bd0 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
16be0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
16bf0 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
16c00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
16c10 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
16c20 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
16c30 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
16c40 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
16c50 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
16c60 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
16c70 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
16c80 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
16c90 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
16ca0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
16cb0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
16cc0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ce0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
16cf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
16d00 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
16d10 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
16d20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
16d30 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
16d40 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
16d50 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
16d60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
16d70 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
16d80 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
16d90 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16da0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
16db0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
16dc0 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
16dd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
16de0 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  n(pPager->pVfs, 
16df0 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  0, pFile, vfsFla
16e00 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
16e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16e20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29  || isOpen(pFile)
16e30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
16e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
16e50 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
16e60 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  unction..**.** T
16e70 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73  he pager invokes
16e80 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
16e90 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f  r if sqlite3OsLo
16ea0 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a  ck() returns .**
16eb0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65   SQLITE_BUSY whe
16ec0 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
16ed0 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b  ade from no-lock
16ee0 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63   to a SHARED loc
16ef0 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72  k,.** or when tr
16f00 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
16f10 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
16f20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55  lock to an EXCLU
16f30 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49  SIVE .** lock. I
16f40 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76  t does *not* inv
16f50 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
16f60 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64  dler when upgrad
16f70 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52  ing from.** SHAR
16f80 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20  ED to RESERVED, 
16f90 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  or when upgradin
16fa0 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  g from SHARED to
16fb0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77   EXCLUSIVE.** (w
16fc0 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69  hich occurs duri
16fd0 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
16fe0 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72  ollback). Summar
16ff0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73  y:.**.**   Trans
17000 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  ition           
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49               | I
17020 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64  nvokes xBusyHand
17030 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ler.**   -------
17040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17070 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20  -.**   NO_LOCK  
17080 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c       -> SHARED_L
17090 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a  OCK      | Yes.*
170a0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
170b0 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f    -> RESERVED_LO
170c0 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  CK    | No.**   
170d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
170e0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
170f0 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45    | No.**   RESE
17100 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43  RVED_LOCK -> EXC
17110 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
17120 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  Yes.**.** If the
17130 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
17140 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e  llback returns n
17150 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
17160 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64  k is .** retried
17170 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20  . If it returns 
17180 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53  zero, then the S
17190 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
171a0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
171b0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66  to the caller of
171c0 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66   the pager API f
171d0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
171e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
171f0 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50  Busyhandler(.  P
17200 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
17230 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ect */.  int (*x
17240 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69  BusyHandler)(voi
17250 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a  d *),         /*
17260 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
17270 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
17280 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
17290 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20  syHandlerArg    
172a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
172b0 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
172c0 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  to xBusyHandler 
172d0 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  */.){  .  pPager
172e0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
172f0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
17300 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
17310 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
17320 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
17330 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20  *.** Report the 
17340 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a  current page siz
17350 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20  e and number of 
17360 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62  reserved bytes b
17370 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f  ack.** to the co
17380 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  dec..*/.#ifdef S
17390 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
173a0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
173b0 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65  rReportSize(Page
173c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
173d0 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
173e0 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20  SizeChng ){.    
173f0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
17400 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70  zeChng(pPager->p
17410 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70  Codec, pPager->p
17420 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17440 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d      (int)pPager-
17450 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a  >nReserve);.  }.
17460 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
17470 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
17480 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70  (X)     /* No-op
17490 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75   if we do not su
174a0 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f  pport a codec */
174b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
174c0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
174d0 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
174e0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
174f0 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
17500 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
17510 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
17520 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
17530 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
17540 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
17550 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17560 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
17570 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
17580 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
17590 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
175a0 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
175b0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
175c0 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
175d0 52 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46  RUPT or SQLITE_F
175e0 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
175f0 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
17600 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
17610 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
17620 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
17630 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
17640 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
17650 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
17660 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
17670 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
17680 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
17690 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
176a0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
176b0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
176c0 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
176d0 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
176e0 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
176f0 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
17700 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
17710 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
17720 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
17730 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
17740 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
17750 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
17760 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
17770 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
17780 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
17790 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
177a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
177b0 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
177c0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
177d0 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
177e0 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
177f0 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
17800 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
17810 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
17820 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
17830 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
17840 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
17850 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
17860 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
17870 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
17880 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
17890 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
178a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
178b0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
178c0 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
178d0 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
178e0 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
178f0 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
17900 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
17910 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
17920 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
17930 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
17940 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
17950 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
17960 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
17970 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
17980 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
17990 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
179a0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
179b0 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
179c0 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
179d0 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
179e0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
179f0 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
17a00 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69  er, u16 *pPageSi
17a10 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
17a20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
17a30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
17a40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17a50 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61  OK ){.    u16 pa
17a60 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
17a70 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
17a80 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
17a90 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
17aa0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
17ab0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
17ac0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67  ) );.    if( pag
17ad0 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
17ae0 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e!=pPager->pageS
17af0 69 7a 65 20 0a 20 20 20 20 20 26 26 20 28 70 50  ize .     && (pP
17b00 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
17b10 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
17b20 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c  ==0).     && sql
17b30 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
17b40 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
17b50 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20  he)==0 .    ){. 
17b60 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20       char *pNew 
17b70 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
17b80 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
17b90 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
17ba0 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20   !pNew ){.      
17bb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
17bc0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
17bd0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
17be0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
17bf0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
17c00 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
17c10 7a 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ze;.        sqli
17c20 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
17c30 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
17c40 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17c50 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
17c60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17c70 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
17c80 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
17c90 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
17ca0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17cb0 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75   *pPageSize = (u
17cc0 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  16)pPager->pageS
17cd0 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  ize;.    if( nRe
17ce0 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
17cf0 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
17d00 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
17d10 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
17d20 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
17d30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
17d40 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
17d50 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
17d60 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
17d70 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
17d80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17d90 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
17da0 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
17db0 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
17dc0 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
17dd0 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
17de0 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
17df0 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
17e00 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
17e10 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
17e20 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
17e30 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
17e40 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
17e50 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
17e60 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
17e70 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
17e80 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
17e90 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
17ea0 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
17eb0 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
17ec0 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
17ed0 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
17ee0 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
17ef0 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
17f00 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
17f10 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
17f20 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
17f30 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17f40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
17f50 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
17f60 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
17f70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
17f80 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
17f90 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
17fa0 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
17fb0 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
17fc0 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
17fd0 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
17fe0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
17ff0 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
18000 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
18010 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
18020 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
18030 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
18040 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
18050 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
18060 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
18070 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
18080 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
18090 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
180a0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
180b0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
180c0 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
180d0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
180e0 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  t(pPager, 0);.  
180f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
18100 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
18110 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
18120 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
18130 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
18140 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
18150 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
18160 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
18170 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
18180 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
18190 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
181a0 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
181b0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
181c0 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
181d0 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
181e0 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
181f0 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
18200 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
18210 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
18220 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
18230 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
18240 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
18250 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
18260 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
18270 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
18280 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
18290 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
182a0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
182b0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
182c0 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
182d0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
182e0 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
182f0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
18300 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
18310 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
18320 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
18330 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
18340 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
18350 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
18360 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
18370 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
18380 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
18390 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
183a0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
183b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
183c0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
183d0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
183e0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
183f0 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
18400 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
18410 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
18420 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
18430 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
18440 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
18450 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
18460 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
18470 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
18480 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
18490 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
184a0 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
184b0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
184c0 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
184d0 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
184e0 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
184f0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
18500 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
18510 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
18520 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
18530 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
18540 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
18550 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
18560 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
18570 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
18580 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
18590 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
185a0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
185b0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
185c0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
185d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
185e0 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
185f0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
18600 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
18610 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
18620 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
18630 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
18640 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18650 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
18660 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
18670 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18680 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
18690 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
186a0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
186b0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
186c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
186d0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
186e0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
186f0 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
18700 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
18710 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
18720 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
18730 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
18740 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
18750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
18760 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
18770 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18780 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
18790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
187a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
187b0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
187c0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
187d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f  tabase file asso
187e0 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
187f0 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  pPager. Normally
18800 2c 20 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c  , this is calcul
18810 61 74 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c  ated as (<db fil
18820 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69  e size>/<page-si
18830 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ze>)..** However
18840 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  , if the file is
18850 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c   between 1 and <
18860 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73  page-size> bytes
18870 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a   in size, then .
18880 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69  ** this is consi
18890 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66  dered a 1 page f
188a0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
188b0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72  e pager is in er
188c0 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
188d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
188e0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
188f0 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20  .** error state 
18900 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18910 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
18920 67 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  ge left unchange
18930 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65  d. Or,.** if the
18940 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73   file system has
18950 20 74 6f 20 62 65 20 71 75 65 72 69 65 64 20 66   to be queried f
18960 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
18970 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  he file and.** t
18980 68 65 20 71 75 65 72 79 20 61 74 74 65 6d 70 74  he query attempt
18990 20 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65   returns an IO e
189a0 72 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72  rror, the IO err
189b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
189c0 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61  ned.** and *pnPa
189d0 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
189e0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  nged..**.** Othe
189f0 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74  rwise, if everyt
18a00 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
18a10 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ul, then SQLITE_
18a20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
18a30 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73  * and *pnPage is
18a40 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
18a50 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
18a60 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
18a70 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
18a80 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
18a90 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
18aa0 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
18ab0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
18ac0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
18ad0 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
18ae0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e */..  /* If th
18af0 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
18b00 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
18b10 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 74 68  state, return th
18b20 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f  e error code. */
18b30 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
18b40 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
18b50 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
18b60 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
18b70 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75  Determine the nu
18b80 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
18b90 20 74 68 65 20 66 69 6c 65 2e 20 53 74 6f 72 65   the file. Store
18ba0 20 74 68 69 73 20 69 6e 20 6e 50 61 67 65 2e 20   this in nPage. 
18bb0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
18bc0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a  >dbSizeValid ){.
18bd0 20 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67      nPage = pPag
18be0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65  er->dbSize;.  }e
18bf0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
18c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c10 20 2f 2a 20 45 72 72 6f 72 20 72 65 74 75 72 6e   /* Error return
18c20 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65  ed by OsFileSize
18c30 28 29 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20  () */.    i64 n 
18c40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18c50 20 20 2f 2a 20 46 69 6c 65 20 73 69 7a 65 20 69    /* File size i
18c60 6e 20 62 79 74 65 73 20 72 65 74 75 72 6e 65 64  n bytes returned
18c70 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29   by OsFileSize()
18c80 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
18c90 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
18ca0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
18cb0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
18cc0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
18cd0 2d 3e 66 64 29 20 26 26 20 28 30 20 21 3d 20 28  ->fd) && (0 != (
18ce0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
18cf0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
18d00 64 2c 20 26 6e 29 29 29 20 29 7b 0a 20 20 20 20  d, &n))) ){.    
18d10 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
18d20 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
18d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18d40 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
18d50 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53   n<pPager->pageS
18d60 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  ize ){.      nPa
18d70 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ge = 1;.    }els
18d80 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
18d90 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67   (Pgno)(n / pPag
18da0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
18dc0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
18dd0 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
18de0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
18df0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
18e00 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
18e10 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
18e20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
18e30 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d  Valid = 1;.    }
18e40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
18e50 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  e current number
18e60 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18e70 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72   file is greater
18e80 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
18e90 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
18ea0 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
18eb0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
18ec0 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
18ed0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
18ee0 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
18ef0 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
18f00 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
18f10 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
18f20 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
18f30 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ge;.  }..  /* Se
18f40 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
18f50 69 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e  iable and return
18f60 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20   SQLITE_OK */.  
18f70 69 66 28 20 70 6e 50 61 67 65 20 29 7b 0a 20 20  if( pnPage ){.  
18f80 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
18f90 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
18fa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
18fb0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
18fc0 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
18fd0 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68  e locktype on th
18fe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18ff0 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72   If.** a similar
19000 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
19010 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
19020 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
19030 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72  is a no-op.** (r
19040 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
19050 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e  OK immediately).
19060 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
19070 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  , attempt to obt
19080 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ain the lock usi
19090 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  ng sqlite3OsLock
190a0 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74  (). Invoke .** t
190b0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
190c0 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
190d0 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
190e0 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20  ailable. Repeat 
190f0 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75  .** until the bu
19100 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
19110 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  rns false or unt
19120 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  il the attempt t
19130 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65  o .** obtain the
19140 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
19150 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
19160 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
19170 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
19180 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
19190 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
191a0 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
191b0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63   is obtained suc
191c0 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74  cessfully, set t
191d0 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a  he Pager.state .
191e0 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c  ** variable to l
191f0 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72  ocktype before r
19200 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
19210 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
19220 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
19230 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
19240 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
19250 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
19260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19270 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
19280 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  /..  /* The OS l
19290 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
192a0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
192b0 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
192c0 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
192d0 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
192e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
192f0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
19300 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
19310 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
19320 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
19330 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
19340 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
19350 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
19360 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
19370 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
19380 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
19390 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
193a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
193b0 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
193c0 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
193d0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
193e0 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68  hat this is eith
193f0 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61  er a no-op (beca
19400 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65  use the requeste
19410 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20  d lock is .  ** 
19420 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72  already held, or
19430 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e   one of the tran
19440 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68  sistions that th
19450 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20  e busy-handler. 
19460 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b   ** may be invok
19470 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72  ed during, accor
19480 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d  ding to the comm
19490 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73  ent above.  ** s
194a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
194b0 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a  syhandler()..  *
194c0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
194d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
194e0 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  type).       || 
194f0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
19500 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20  PAGER_UNLOCK && 
19510 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f  locktype==PAGER_
19520 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
19530 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  | (pPager->state
19540 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
19550 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41   && locktype==PA
19560 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  GER_EXCLUSIVE). 
19570 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
19580 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
19590 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
195a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
195b0 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
195c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
195d0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
195e0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
195f0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
19600 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65  TE_BUSY && pPage
19610 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  r->xBusyHandler(
19620 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
19630 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20  dlerArg) );.    
19640 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19650 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
19660 72 2d 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c  r->state = (u8)l
19670 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
19680 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
19690 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
196a0 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
196b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
196c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
196d0 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
196e0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
196f0 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
19700 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
19710 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
19720 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
19730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19740 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
19750 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
19760 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
19770 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
19780 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
19790 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
197a0 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
197b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
197c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
197d0 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  itted..*/.void s
197e0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
197f0 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
19800 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
19810 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
19820 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
19830 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
19840 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
19850 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
19860 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19870 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
19880 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
19890 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a  Size = nPage;.}.
198a0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
198b0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
198c0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
198d0 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
198e0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
198f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
19900 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
19910 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
19920 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
19930 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
19940 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
19950 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
19960 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
19970 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
19980 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
19990 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
199a0 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
199b0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
199c0 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
199d0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
199e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
199f0 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
19a00 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
19a10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
19a20 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
19a30 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
19a40 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
19a50 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
19a60 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
19a70 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
19a80 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
19a90 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
19aa0 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
19ab0 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
19ac0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
19ad0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
19ae0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
19af0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
19b00 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
19b10 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
19b20 72 29 7b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  r){.  disable_si
19b30 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
19b40 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
19b50 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
19b60 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
19b70 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
19b80 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
19b90 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
19ba0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
19bb0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
19bc0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
19bd0 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
19be0 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
19bf0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
19c00 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
19c10 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
19c20 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
19c30 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
19c40 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
19c50 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
19c60 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
19c70 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
19c80 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
19c90 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
19ca0 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
19cb0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
19cc0 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
19cd0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
19ce0 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
19cf0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
19d00 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
19d10 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
19d20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
19d30 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
19d40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
19d50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
19d60 20 2d 31 3b 0a 20 20 20 20 70 61 67 65 72 55 6e   -1;.    pagerUn
19d70 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
19d80 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
19d90 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
19da0 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
19db0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
19dc0 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
19dd0 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
19de0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
19df0 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
19e00 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
19e10 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
19e20 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
19e30 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
19e40 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
19e50 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
19e60 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
19e70 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
19e80 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
19e90 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
19ea0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
19eb0 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
19ec0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
19ed0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
19ee0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
19ef0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
19f00 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
19f10 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
19f20 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
19f30 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
19f40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
19f50 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
19f60 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
19f70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19f80 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
19f90 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
19fa0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
19fb0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
19fc0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
19fd0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
19fe0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
19ff0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
1a000 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
1a010 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
1a020 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a030 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
1a040 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
1a050 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
1a060 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1a070 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
1a080 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
1a090 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
1a0a0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
1a0b0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
1a0c0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
1a0d0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
1a0e0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
1a0f0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1a100 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
1a110 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
1a120 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
1a130 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
1a140 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
1a150 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
1a160 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1a170 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
1a180 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1a190 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
1a1a0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1a1b0 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  tion is a.** no-
1a1c0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
1a1d0 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
1a1e0 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
1a1f0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a  e journal-mode.*
1a200 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65  * and the device
1a210 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1a220 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
1a230 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
1a240 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
1a250 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1a260 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
1a270 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
1a280 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
1a290 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
1a2a0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
1a2b0 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
1a2c0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
1a2d0 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
1a2e0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
1a2f0 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
1a300 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
1a310 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
1a320 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
1a330 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
1a340 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
1a350 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
1a360 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
1a370 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
1a380 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
1a390 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
1a3a0 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
1a3b0 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
1a3c0 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
1a3d0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1a3e0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
1a3f0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
1a400 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
1a410 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
1a420 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1a430 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
1a440 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
1a450 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
1a460 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
1a470 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
1a480 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
1a490 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
1a4a0 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
1a4b0 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
1a4c0 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
1a4d0 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
1a4e0 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
1a4f0 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
1a500 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1a510 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
1a520 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
1a530 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
1a540 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
1a550 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
1a560 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
1a570 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65  ** The Pager.nee
1a580 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65  dSync flag is ne
1a590 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74  ver be set for t
1a5a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1a5b0 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f  or any.** file o
1a5c0 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73  perating in no-s
1a5d0 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e  ync mode (Pager.
1a5e0 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f  noSync set to no
1a5f0 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49  n-zero)..**.** I
1a600 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
1a610 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
1a620 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
1a630 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
1a640 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
1a650 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
1a660 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
1a670 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
1a680 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
1a690 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1a6a0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
1a6b0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1a6c0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1a6d0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1a6e0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
1a6f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a700 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
1a710 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
1a720 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1a730 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1a740 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1a750 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1a760 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1a770 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1a780 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a7a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1a7b0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
1a7c0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1a7d0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1a7e0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1a7f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a800 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1a810 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
1a820 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1a830 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1a840 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
1a850 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
1a860 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
1a870 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
1a880 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
1a890 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
1a8a0 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
1a8b0 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
1a8c0 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
1a8d0 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
1a8e0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
1a8f0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1a900 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
1a910 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
1a920 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
1a930 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1a940 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
1a950 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
1a960 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
1a970 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1a980 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
1a990 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
1a9a0 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
1a9b0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
1a9c0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
1a9d0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73  onnections trans
1a9e0 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
1a9f0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
1aa00 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
1aa10 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
1aa20 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
1aa30 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
1aa40 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
1aa50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
1aa60 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
1aa70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1aa80 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
1aa90 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
1aaa0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1aab0 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
1aac0 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
1aad0 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
1aae0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
1aaf0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1ab00 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
1ab10 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
1ab20 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
1ab30 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
1ab40 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
1ab50 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
1ab60 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
1ab70 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
1ab80 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
1ab90 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1aba0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
1abb0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1abc0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1abd0 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1abe0 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
1abf0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
1ac00 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
1ac10 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
1ac20 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
1ac30 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
1ac40 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
1ac50 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
1ac60 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
1ac70 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
1ac80 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
1ac90 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
1aca0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1acb0 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
1acc0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
1acd0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1ace0 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
1acf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
1ad00 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
1ad10 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
1ad20 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
1ad30 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
1ad40 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
1ad50 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
1ad60 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
1ad70 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
1ad80 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
1ad90 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
1ada0 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1adb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
1adc0 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
1add0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
1ade0 67 69 63 5b 38 5d 3b 0a 09 75 38 20 7a 48 65 61  gic[8];..u8 zHea
1adf0 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
1ae00 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 09  nalMagic)+4];...
1ae10 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
1ae20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
1ae30 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1ae40 67 69 63 29 29 3b 0a 09 70 75 74 33 32 62 69 74  gic));..put32bit
1ae50 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
1ae60 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1ae70 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
1ae80 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
1ae90 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
1aea0 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
1aeb0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
1aec0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1aed0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
1aee0 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
1aef0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
1af00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1af10 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
1af20 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
1af30 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
1af40 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
1af50 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
1af60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1af70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1af80 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
1af90 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
1afa0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
1afb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1afc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1afd0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1afe0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1aff0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
1b000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1b010 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
1b020 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
1b030 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
1b040 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
1b050 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
1b060 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
1b070 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
1b080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
1b090 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
1b0a0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
1b0b0 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
1b0c0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
1b0d0 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
1b0e0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
1b0f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
1b100 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
1b110 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
1b120 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
1b130 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
1b140 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
1b150 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
1b160 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
1b170 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
1b180 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
1b190 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
1b1a0 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
1b1b0 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
1b1c0 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
1b1d0 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
1b1e0 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
1b1f0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
1b200 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
1b210 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
1b220 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
1b230 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1b240 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
1b250 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
1b260 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
1b270 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1b280 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1b290 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
1b2a0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1b2b0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
1b2c0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1b2d0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
1b2e0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
1b2f0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1b300 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
1b310 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
1b320 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1b330 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b340 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1b350 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
1b360 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  nc_flags);.     
1b370 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b380 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1b390 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1b3a0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1b3b0 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
1b3c0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
1b3d0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
1b3e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b3f0 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
1b400 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1b410 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
1b420 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
1b430 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1b440 72 0a 09 29 3b 0a 20 20 20 20 20 20 20 20 69 66  r..);.        if
1b450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b460 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1b470 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
1b480 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
1b490 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
1b4a0 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
1b4b0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
1b4c0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
1b4d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
1b4e0 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
1b4f0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
1b500 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
1b510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b520 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1b530 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
1b540 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
1b550 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66   (pPager->sync_f
1b560 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
1b570 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
1b580 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
1b590 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1b5a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b5b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1b5d0 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
1b5e0 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
1b5f0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79   successfully sy
1b600 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65 72 2e  nced. Set Pager.
1b610 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a  needSync .    **
1b620 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65   to zero and cle
1b630 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
1b640 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61  D_SYNC flag on a
1b650 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20 20 2a  ll pagess..    *
1b660 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  /.    pPager->ne
1b670 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
1b680 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1b690 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
1b6a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
1b6b0 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
1b6c0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1b6d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1b6e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b6f0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
1b700 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
1b710 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
1b720 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
1b730 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
1b740 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
1b750 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
1b760 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
1b770 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
1b780 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
1b790 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
1b7a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1b7b0 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
1b7c0 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
1b7d0 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
1b7e0 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
1b7f0 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
1b800 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
1b810 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
1b820 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
1b830 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
1b840 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
1b850 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
1b860 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
1b870 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
1b880 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b890 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
1b8a0 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
1b8b0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1b8c0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
1b8d0 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
1b8e0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
1b8f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1b900 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
1b910 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
1b920 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
1b930 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1b940 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
1b950 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
1b960 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
1b970 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
1b980 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
1b990 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
1b9a0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
1b9b0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
1b9c0 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
1b9d0 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
1b9e0 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
1b9f0 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
1ba00 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
1ba10 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
1ba20 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
1ba30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ba40 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
1ba50 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
1ba60 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
1ba70 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
1ba80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1ba90 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
1baa0 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
1bab0 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
1bac0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
1bad0 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
1bae0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1baf0 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
1bb00 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
1bb10 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
1bb20 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
1bb30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1bb40 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
1bb50 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
1bb60 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
1bb70 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
1bb80 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
1bb90 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
1bba0 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
1bbb0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1bbc0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
1bbd0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
1bbe0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
1bbf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1bc00 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1bc10 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1bc20 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1bc30 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
1bc40 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
1bc50 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
1bc60 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1bc70 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
1bc80 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
1bc90 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
1bca0 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
1bcb0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1bcc0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1bcd0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
1bce0 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
1bcf0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1bd20 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
1bd30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bd50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1bd60 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c  ..  if( NEVER(pL
1bd70 69 73 74 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  ist==0) ) return
1bd80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
1bd90 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50  ager = pList->pP
1bda0 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  ager;..  /* At t
1bdb0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
1bdc0 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
1bdd0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
1bde0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1bdf0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
1be00 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
1be10 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
1be20 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
1be30 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
1be40 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
1be50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
1be60 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
1be70 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
1be80 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
1be90 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
1bea0 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
1beb0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
1bec0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
1bed0 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
1bee0 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
1bef0 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
1bf00 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1bf10 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
1bf20 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
1bf30 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
1bf40 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
1bf50 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
1bf60 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
1bf70 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
1bf80 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
1bf90 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
1bfa0 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
1bfb0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
1bfc0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
1bfd0 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
1bfe0 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
1bff0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1c000 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
1c010 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
1c020 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
1c030 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
1c040 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
1c050 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
1c060 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1c070 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
1c080 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
1c090 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
1c0a0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1c0b0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
1c0c0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
1c0d0 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
1c0e0 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
1c0f0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
1c100 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c110 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c120 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1c130 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
1c140 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1c150 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
1c160 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  K);..  /* If the
1c170 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
1c180 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
1c190 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
1c1a0 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
1c1b0 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
1c1c0 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
1c1d0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1c1e0 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
1c1f0 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
1c200 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
1c210 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
1c220 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
1c230 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
1c240 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
1c250 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
1c260 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
1c270 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
1c280 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
1c290 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
1c2a0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
1c2b0 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
1c2c0 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68  lags);.  }..  wh
1c2d0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1c2e0 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
1c2f0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
1c300 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
1c310 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1c320 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
1c330 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
1c340 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1c350 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
1c360 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
1c370 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
1c380 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1c390 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
1c3a0 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
1c3b0 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
1c3c0 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
1c3d0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1c3e0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
1c3f0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
1c400 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
1c410 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1c420 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
1c430 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
1c440 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
1c450 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
1c460 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
1c470 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
1c480 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
1c490 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
1c4a0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
1c4b0 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
1c4c0 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
1c4d0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
1c4e0 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
1c4f0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1c500 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
1c510 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
1c520 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
1c530 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
1c570 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
1c580 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
1c590 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
1c5a0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1c5b0 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
1c5c0 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
1c5d0 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
1c5e0 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
1c5f0 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
1c600 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
1c610 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1c620 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
1c630 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1c640 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
1c650 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
1c660 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
1c670 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
1c680 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
1c690 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
1c6a0 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
1c6b0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
1c6c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
1c6d0 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
1c6e0 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
1c6f0 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
1c700 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
1c710 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
1c720 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
1c730 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
1c740 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1c750 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c760 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
1c770 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1c780 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1c790 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1c7a0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
1c7b0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
1c7c0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1c7d0 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
1c7e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
1c7f0 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70  pdate any backup
1c800 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67   objects copying
1c810 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1c820 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a   this pager. */.
1c830 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
1c840 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
1c850 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
1c860 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61   (u8*)pList->pDa
1c870 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45  ta);..      PAGE
1c880 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25  RTRACE(("STORE %
1c890 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1c8a0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1c8c0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1c8d0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1c8e0 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
1c8f0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
1c900 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
1c910 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
1c920 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1c930 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
1c940 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  db_count);.     
1c950 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1c960 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
1c970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
1c980 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
1c990 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
1c9a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c9b0 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
1c9c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1c9d0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
1c9e0 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
1c9f0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1ca00 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
1ca10 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
1ca20 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
1ca30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ca40 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
1ca50 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
1ca60 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
1ca70 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
1ca80 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74  -journal. .** It
1ca90 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
1caa0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74  responsibility t
1cab0 6f 20 75 73 65 20 73 75 62 6a 52 65 71 75 69 72  o use subjRequir
1cac0 65 73 50 61 67 65 28 29 20 74 6f 20 63 68 65 63  esPage() to chec
1cad0 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73  k .** that it is
1cae0 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
1caf0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
1cb00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1cb10 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1cb20 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74 20  ul, set the bit 
1cb30 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1cb40 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68   pPg->pgno in th
1cb50 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72  e bitvecs.** for
1cb60 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
1cb70 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74 75  ints before retu
1cb80 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rning..**.** Thi
1cb90 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1cba0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  ns SQLITE_OK if 
1cbb0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
1cbc0 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a  ccessful, an IO.
1cbd0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  ** error code if
1cbe0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
1cbf0 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75 62  write to the sub
1cc00 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  -journal fails, 
1cc10 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  or .** SQLITE_NO
1cc20 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
1cc30 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74  fails while sett
1cc40 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20 73  ing a bit in a s
1cc50 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76  avepoint.** bitv
1cc60 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ec..*/.static in
1cc70 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  t subjournalPage
1cc80 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1cc90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1cca0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1ccb0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1ccc0 72 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  r;.  if( isOpen(
1ccd0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b  pPager->sjfd) ){
1cce0 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
1ccf0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
1cd00 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1cd10 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a  pPager->nSubRec*
1cd20 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
1cd30 69 7a 65 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ize);.    char *
1cd40 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 43 4f 44  pData2;..    COD
1cd50 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
1cd60 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
1cd70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1cd80 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
1cd90 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1cda0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
1cdb0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1cdc0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1cdd0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 0a 20 20 20  ->pgno));.  .   
1cde0 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a   assert( pageInJ
1cdf0 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70  ournal(pPg) || p
1ce00 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1ce10 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
1ce20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
1ce30 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
1ce40 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
1ce50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
1ce60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ce70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ce80 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1ce90 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  >sjfd, pData2, p
1cea0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1ceb0 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20   offset+4);.    
1cec0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1ced0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cee0 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
1cef0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
1cf00 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
1cf10 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  nt>0 );.    rc =
1cf20 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
1cf30 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
1cf40 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 74  Pg->pgno);.    t
1cf50 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
1cf60 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20  ITE_OK );.  }.  
1cf70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1cf80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1cf90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
1cfa0 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
1cfb0 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65 61   when it has rea
1cfc0 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66  ched some.** sof
1cfd0 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20  t memory limit. 
1cfe0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1cff0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
1d000 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63  to a Pager objec
1d010 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20  t.** (cast as a 
1d020 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65  void*). The page
1d030 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75 72  r is always 'pur
1d040 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20  geable' (not an 
1d050 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
1d060 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f  abase). The seco
1d070 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
1d080 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
1d090 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a  page that is .**
1d0a0 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
1d0b0 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73   but has no outs
1d0c0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1d0d0 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20  es. The page.** 
1d0e0 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69  is always associ
1d0f0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50 61  ated with the Pa
1d100 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
1d110 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
1d120 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  ** argument..**.
1d130 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  ** The job of th
1d140 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
1d150 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e  o make pPg clean
1d160 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73 20   by writing its 
1d170 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20  contents.** out 
1d180 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d190 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  file, if possibl
1d1a0 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f  e. This may invo
1d1b0 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a  lve syncing the.
1d1c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
1d1d0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65   .**.** If succe
1d1e0 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63  ssful, sqlite3Pc
1d1f0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
1d200 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
1d210 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c   page and.** SQL
1d220 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1d230 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1d240 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
1d250 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ing to make the.
1d260 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74  ** page clean, t
1d270 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1d280 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1d290 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74   the page cannot
1d2a0 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61   be.** made clea
1d2b0 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  n for some other
1d2c0 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20   reason, but no 
1d2d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1d2e0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  en SQLITE_OK.** 
1d2f0 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  is returned by s
1d300 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
1d310 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63  Clean() is not c
1d320 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
1d330 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
1d340 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
1d350 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1d360 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
1d370 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
1d380 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
1d390 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
1d3a0 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
1d3b0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
1d3c0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
1d3d0 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74  ..  /* The doNot
1d3e0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
1d3f0 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 50   by the sqlite3P
1d400 61 67 65 72 57 72 69 74 65 28 29 20 66 75 6e 63  agerWrite() func
1d410 74 69 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20  tion while it.  
1d420 2a 2a 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e  ** is journallin
1d430 67 20 61 20 73 65 74 20 6f 66 20 74 77 6f 20 6f  g a set of two o
1d440 72 20 6d 6f 72 65 20 64 61 74 61 62 61 73 65 20  r more database 
1d450 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 73  pages that are s
1d460 74 6f 72 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68  tored.  ** on th
1d470 65 20 73 61 6d 65 20 64 69 73 6b 20 73 65 63 74  e same disk sect
1d480 6f 72 2e 20 53 79 6e 63 69 6e 67 20 74 68 65 20  or. Syncing the 
1d490 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1d4a0 6c 6c 6f 77 65 64 20 77 68 69 6c 65 0a 20 20 2a  llowed while.  *
1d4b0 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
1d4c0 69 6e 67 20 61 73 20 69 74 20 69 73 20 69 6d 70  ing as it is imp
1d4d0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20  ortant that all 
1d4e0 6d 65 6d 62 65 72 73 20 6f 66 20 73 75 63 68 20  members of such 
1d4f0 61 0a 20 20 2a 2a 20 73 65 74 20 6f 66 20 70 61  a.  ** set of pa
1d500 67 65 73 20 61 72 65 20 73 79 6e 63 65 64 20 74  ges are synced t
1d510 6f 20 64 69 73 6b 20 74 6f 67 65 74 68 65 72 2e  o disk together.
1d520 20 53 6f 2c 20 69 66 20 74 68 65 20 70 61 67 65   So, if the page
1d530 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
1d540 20 2a 2a 20 69 73 20 74 72 79 69 6e 67 20 74 6f   ** is trying to
1d550 20 6d 61 6b 65 20 63 6c 65 61 6e 20 77 69 6c 6c   make clean will
1d560 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
1d570 61 6c 20 73 79 6e 63 20 61 6e 64 20 74 68 65 20  al sync and the 
1d580 64 6f 4e 6f 74 53 79 6e 63 0a 20 20 2a 2a 20 66  doNotSync.  ** f
1d590 6c 61 67 20 69 73 20 73 65 74 2c 20 72 65 74 75  lag is set, retu
1d5a0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
1d5b0 20 61 6e 79 74 68 69 6e 67 2e 20 54 68 65 20 70   anything. The p
1d5c0 63 61 63 68 65 20 6c 61 79 65 72 20 77 69 6c 6c  cache layer will
1d5d0 0a 20 20 2a 2a 20 6a 75 73 74 20 68 61 76 65 20  .  ** just have 
1d5e0 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  to go ahead and 
1d5f0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  allocate a new p
1d600 61 67 65 20 62 75 66 66 65 72 20 69 6e 73 74 65  age buffer inste
1d610 61 64 20 6f 66 0a 20 20 2a 2a 20 72 65 75 73 69  ad of.  ** reusi
1d620 6e 67 20 70 50 67 2e 0a 20 20 2a 2a 0a 20 20 2a  ng pPg..  **.  *
1d630 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20  * Similarly, if 
1d640 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
1d650 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
1d660 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  e error state, d
1d670 6f 20 6e 6f 74 0a 20 20 2a 2a 20 74 72 79 20 74  o not.  ** try t
1d680 6f 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  o write the cont
1d690 65 6e 74 73 20 6f 66 20 70 50 67 20 74 6f 20 64  ents of pPg to d
1d6a0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
1d6b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1d6c0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  || (pPager->doNo
1d6d0 74 53 79 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c  tSync && pPg->fl
1d6e0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1d6f0 59 4e 43 29 20 29 7b 0a 20 20 20 20 72 65 74 75  YNC) ){.    retu
1d700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d710 7d 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  }..  /* Sync the
1d720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1d730 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
1d740 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
1d750 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
1d760 7b 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a  {.    rc = syncJ
1d770 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1d780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d790 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1d7a0 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20  >fullSync && .  
1d7b0 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f      !(pPager->jo
1d7c0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
1d7d0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
1d7e0 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 21 28  ORY) &&.      !(
1d7f0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1d800 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1d810 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
1d820 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1d830 45 4e 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  END).    ){.    
1d840 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
1d850 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
1d860 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1d870 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1d880 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
1d890 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1d8a0 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65  is page is large
1d8b0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
1d8c0 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20  nt size of.  ** 
1d8d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
1d8e0 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20  ge, it may need 
1d8f0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  to be written to
1d900 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1d910 2e 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62  ..  ** This is b
1d920 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
1d930 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  to pager_write_p
1d940 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20  agelist() below 
1d950 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61 63  will not.  ** ac
1d960 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74  tually write dat
1d970 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e  a to the file in
1d980 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
1d990 0a 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  .  ** Consider t
1d9a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71  he following seq
1d9b0 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a  uence of events:
1d9c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47  .  **.  **   BEG
1d9d0 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  IN;.  **     <jo
1d9e0 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20  urnal page X>.  
1d9f0 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70  **     <modify p
1da00 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20  age X>.  **     
1da10 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20  SAVEPOINT sp;.  
1da20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b  **       <shrink
1da30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1da40 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 2a 2a 20  o Y pages>.  ** 
1da50 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73        pagerStres
1da60 73 28 70 61 67 65 20 58 29 0a 20 20 2a 2a 20 20  s(page X).  **  
1da70 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73     ROLLBACK TO s
1da80 70 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  p;.  **.  ** If 
1da90 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e  (X>Y), then when
1daa0 20 70 61 67 65 72 53 74 72 65 73 73 20 69 73 20   pagerStress is 
1dab0 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69  called page X wi
1dac0 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
1dad0 6e 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68  n.  ** out to th
1dae0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1daf0 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f   but will be dro
1db00 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  pped from the ca
1db10 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a 20  che. Then,.  ** 
1db20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52  following the "R
1db30 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73  OLLBACK TO sp" s
1db40 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e  tatement, readin
1db50 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65  g page X will re
1db60 61 64 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ad.  ** data fro
1db70 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1db80 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62  ile. This will b
1db90 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61  e the copy of pa
1dba0 67 65 20 58 20 61 73 20 69 74 0a 20 20 2a 2a 20  ge X as it.  ** 
1dbb0 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61  was when the tra
1dbc0 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1dbd0 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20  , not as it was 
1dbe0 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20  when "SAVEPOINT 
1dbf0 73 70 22 0a 20 20 2a 2a 20 77 61 73 20 65 78 65  sp".  ** was exe
1dc00 63 75 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cuted..  **.  **
1dc10 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
1dc20 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
1dc30 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70  rrent data for p
1dc40 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a  age X into the .
1dc50 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c    ** sub-journal
1dc60 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74   file now (if it
1dc70 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1dc80 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20  there), so that 
1dc90 69 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  it will.  ** be 
1dca0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
1dcb0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68  current value wh
1dcc0 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
1dcd0 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 2a 2a   TO sp" is .  **
1dce0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a   executed..  */.
1dcf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dd00 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f  _OK && pPg->pgno
1dd10 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
1dd20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
1dd30 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
1dd40 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
1dd50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  age(pPg);.  }.. 
1dd60 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
1dd70 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
1dd80 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
1dd90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
1dda0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ddb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  _OK ){.    pPg->
1ddc0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
1ddd0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1dde0 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
1ddf0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
1de00 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1de10 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
1de20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1de30 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
1de40 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
1de50 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1de60 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
1de70 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
1de80 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
1de90 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1dea0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1deb0 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  er, rc);.}.../*.
1dec0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
1ded0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
1dee0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e   Pager object an
1def0 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
1df00 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50  to it.** in *ppP
1df10 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20  ager. The pager 
1df20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c  should eventuall
1df30 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61  y be freed by pa
1df40 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73  ssing it.** to s
1df50 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
1df60 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  ()..**.** The zF
1df70 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
1df80 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20   is the path to 
1df90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dfa0 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66  e to open..** If
1dfb0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
1dfc0 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
1dfd0 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
1dfe0 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
1dff0 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
1e000 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
1e010 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61   cached. Tempora
1e020 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20  ry files are be 
1e030 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d  deleted.** autom
1e040 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68  atically when th
1e050 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49  ey are closed. I
1e060 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
1e070 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a  :memory:" then .
1e080 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  ** all informati
1e090 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
1e0a0 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72  che. It is never
1e0b0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
1e0c0 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62  . .** This can b
1e0d0 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
1e0e0 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ent an in-memory
1e0f0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1e100 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61   The nExtra para
1e110 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20  meter specifies 
1e120 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1e130 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  tes of space all
1e140 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
1e150 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72  with each page r
1e160 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73  eference. This s
1e170 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
1e180 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a  e to the user.**
1e190 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33   via the sqlite3
1e1a0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20  PagerGetExtra() 
1e1b0 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  API..**.** The f
1e1c0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
1e1d0 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
1e1e0 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
1e1f0 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
1e200 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
1e210 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
1e220 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
1e230 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
1e240 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
1e250 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
1e260 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45   and PAGER_NO_RE
1e270 41 44 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a  ADLOCK flags..**
1e280 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
1e290 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
1e2a0 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
1e2b0 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
1e2c0 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
1e2d0 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
1e2e0 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
1e2f0 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
1e300 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
1e310 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
1e320 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
1e330 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
1e340 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
1e350 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
1e360 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e370 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
1e380 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
1e390 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
1e3a0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
1e3b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1e3c0 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
1e3d0 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
1e3e0 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
1e3f0 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
1e400 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
1e410 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
1e420 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
1e430 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
1e440 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
1e450 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
1e460 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
1e470 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
1e480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1e490 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
1e4a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
1e4b0 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
1e4c0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
1e4d0 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
1e4e0 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
1e4f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
1e500 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
1e510 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
1e520 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1e530 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
1e540 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1e550 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
1e560 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e580 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
1e590 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
1e5a0 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
1e5b0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
1e5c0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
1e5d0 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
1e5e0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
1e5f0 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
1e600 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
1e610 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
1e620 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
1e630 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
1e640 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
1e650 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
1e660 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
1e670 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
1e680 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
1e690 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
1e6a0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1e6b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
1e6c0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
1e6d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e6e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e6f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
1e700 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
1e710 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
1e720 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
1e730 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
1e740 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
1e750 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1e760 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1e770 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1e780 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  file */.  int re
1e790 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
1e7a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1e7b0 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
1e7c0 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
1e7d0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
1e7e0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
1e7f0 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
1e800 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
1e810 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
1e820 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
1e830 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
1e840 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
1e850 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
1e860 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
1e870 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
1e880 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
1e890 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
1e8a0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
1e8b0 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
1e8c0 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
1e8d0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
1e8e0 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66   noReadlock = (f
1e8f0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f  lags & PAGER_NO_
1e900 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f  READLOCK)!=0;  /
1e910 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72  * True to omit r
1e920 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e  ead-lock */.  in
1e930 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73  t pcacheSize = s
1e940 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
1e950 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74  ();       /* Byt
1e960 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
1e970 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75  or PCache */.  u
1e980 31 36 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20  16 szPageDflt = 
1e990 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1e9a0 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65  AGE_SIZE;  /* De
1e9b0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
1e9c0 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
1e9d0 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
1e9e0 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
1e9f0 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
1ea00 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
1ea10 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
1ea20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
1ea30 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
1ea40 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
1ea50 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65  This.  ** is the
1ea60 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72   maximum space r
1ea70 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69  equired for an i
1ea80 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1ea90 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20   file handle .  
1eaa0 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72  ** and a regular
1eab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
1eac0 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20  ndle. Note that 
1ead0 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  a "regular journ
1eae0 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20  al-handle".  ** 
1eaf0 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72  may be a wrapper
1eb00 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68   capable of cach
1eb10 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f  ing the first po
1eb20 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  rtion of the jou
1eb30 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
1eb40 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c  n memory to impl
1eb50 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63  ement the atomic
1eb60 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
1eb70 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73  ion (see .  ** s
1eb80 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e  ource file journ
1eb90 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  al.c)..  */.  if
1eba0 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  ( sqlite3Journal
1ebb0 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74  Size(pVfs)>sqlit
1ebc0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
1ebd0 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  () ){.    journa
1ebe0 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
1ebf0 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  D8(sqlite3Journa
1ec00 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20  lSize(pVfs));.  
1ec10 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e  }else{.    journ
1ec20 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
1ec30 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  ND8(sqlite3MemJo
1ec40 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20  urnalSize());.  
1ec50 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1ec60 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
1ec70 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20  to NULL in case 
1ec80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
1ec90 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
1eca0 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   0;..  /* Comput
1ecb0 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
1ecc0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e  full pathname in
1ecd0 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75   an allocated bu
1ece0 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a  ffer pointed.  *
1ecf0 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d  * to by zPathnam
1ed00 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e  e, length nPathn
1ed10 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73  ame. Or, if this
1ed20 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
1ed30 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65  file,.  ** leave
1ed40 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20   both nPathname 
1ed50 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65  and zPathname se
1ed60 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69  t to 0..  */.  i
1ed70 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
1ed80 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
1ed90 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
1eda0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1edb0 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d  +1;.    zPathnam
1edc0 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
1edd0 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a  c(nPathname*2);.
1ede0 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
1edf0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
1ee00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1ee10 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  M;.    }.#ifndef
1ee20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
1ee30 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
1ee40 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
1ee50 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
1ee60 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
1ee70 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  ;.      zPathnam
1ee80 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65  e[0] = 0;.    }e
1ee90 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
1eea0 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
1eeb0 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
1eec0 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
1eed0 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
1eee0 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
1eef0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
1ef00 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
1ef10 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
1ef20 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
1ef30 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
1ef40 0a 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ..    nPathname 
1ef50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1ef60 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
1ef70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ef80 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
1ef90 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
1efa0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
1efb0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
1efc0 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
1efd0 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
1efe0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
1eff0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
1f000 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
1f010 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
1f020 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
1f030 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
1f040 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
1f050 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
1f060 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
1f070 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
1f080 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
1f090 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
1f0a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
1f0b0 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
1f0c0 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
1f0d0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
1f0e0 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
1f0f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f100 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
1f110 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1f120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f130 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1f140 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
1f150 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f160 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
1f170 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
1f180 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1f190 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
1f1a0 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
1f1b0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1f1c0 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
1f1d0 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
1f1e0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
1f1f0 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
1f200 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
1f210 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1f220 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
1f230 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
1f250 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
1f260 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
1f270 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1f290 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
1f2a0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
1f2b0 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
1f2c0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
1f2d0 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
1f2e0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
1f2f0 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
1f300 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
1f310 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
1f320 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
1f330 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
1f340 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
1f350 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
1f360 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
1f370 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
1f380 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
1f390 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
1f3a0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1f3b0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
1f3c0 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
1f3d0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
1f3e0 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
1f3f0 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
1f400 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
1f410 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
1f420 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
1f430 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
1f440 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
1f450 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
1f460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
1f470 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
1f480 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
1f490 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
1f4a0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
1f4b0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
1f4c0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
1f4d0 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
1f4e0 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
1f4f0 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
1f500 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20  hname + 1 +     
1f510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
1f520 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
1f530 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31  Pathname + 8 + 1
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f550 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29   zJournal */.  )
1f560 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1f570 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1f580 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
1f590 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
1f5a0 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
1f5b0 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
1f5c0 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
1f5d0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
1f5e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1f5f0 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
1f600 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
1f610 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
1f620 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
1f630 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
1f640 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
1f650 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
1f660 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
1f670 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
1f680 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
1f690 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
1f6a0 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
1f6b0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
1f6c0 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
1f6d0 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
1f6e0 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
1f6f0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
1f700 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
1f710 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
1f720 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
1f730 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
1f740 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
1f750 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
1f760 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
1f770 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1f780 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
1f790 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
1f7a0 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
1f7b0 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
1f7c0 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
1f7d0 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
1f7e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a  {.    pPager->zJ
1f7f0 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72  ournal =   (char
1f800 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68  *)(pPtr += nPath
1f810 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d  name + 1);.    m
1f820 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
1f830 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
1f840 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
1f850 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
1f860 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
1f870 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
1f880 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
1f890 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1f8a0 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
1f8b0 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20  ournal", 8);.   
1f8c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69   if( pPager->zFi
1f8d0 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70  lename[0]==0 ) p
1f8e0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
1f8f0 30 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  0] = 0;.    sqli
1f900 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
1f910 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
1f920 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
1f930 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
1f940 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
1f950 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
1f960 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
1f970 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
1f980 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26  & zFilename[0] &
1f990 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  & !memDb ){.    
1f9a0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20  int fout = 0;   
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9c0 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65   /* VFS flags re
1f9d0 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28  turned by xOpen(
1f9e0 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ) */.    rc = sq
1f9f0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
1fa00 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
1fa10 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
1fa20 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74   vfsFlags, &fout
1fa30 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  );.    readOnly 
1fa40 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
1fa50 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a  PEN_READONLY);..
1fa60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
1fa70 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
1fa80 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
1fa90 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
1faa0 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20  ,.    ** choose 
1fab0 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  a default page s
1fac0 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68  ize in case we h
1fad0 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68  ave to create th
1fae0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1faf0 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61  e file. The defa
1fb00 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
1fb10 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a   the maximum of:
1fb20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1fb30 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
1fb40 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
1fb50 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
1fb60 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1fb70 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
1fb80 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20  ize().    **    
1fb90 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61  + The largest pa
1fba0 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e  ge size that can
1fbb0 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
1fbc0 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  ically..    */. 
1fbd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fbe0 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c  E_OK && !readOnl
1fbf0 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65  y ){.      setSe
1fc00 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
1fc10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53  ;.      assert(S
1fc20 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
1fc30 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f  GE_SIZE<=SQLITE_
1fc40 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1fc50 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66  _SIZE);.      if
1fc60 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
1fc70 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1fc80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1fc90 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1fca0 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
1fcb0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
1fcc0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
1fcd0 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
1fce0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1fcf0 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d  _SIZE;.        }
1fd00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1fd10 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31  szPageDflt = (u1
1fd20 36 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  6)pPager->sector
1fd30 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
1fd40 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
1fd50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
1fd60 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
1fd70 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  {.        int iD
1fd80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
1fd90 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1fda0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
1fdb0 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
1fdc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
1fdd0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1fde0 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
1fdf0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1fe00 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
1fe10 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
1fe20 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
1fe30 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
1fe40 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1fe50 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
1fe60 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65     for(ii=szPage
1fe70 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45  Dflt; ii<=SQLITE
1fe80 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
1fe90 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29  E_SIZE; ii=ii*2)
1fea0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1feb0 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
1fec0 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
1fed0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1fee0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
1fef0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ff00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ff10 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1ff20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
1ff30 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1ff40 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1ff50 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
1ff60 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
1ff70 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
1ff80 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
1ff90 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1ffa0 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
1ffb0 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
1ffc0 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
1ffd0 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
1ffe0 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
1fff0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
20000 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
20010 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
20020 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
20030 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
20040 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
20050 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
20060 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
20070 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
20080 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
20090 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
200a0 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
200b0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20  journal..    */ 
200c0 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
200d0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
200e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
200f0 4c 55 53 49 56 45 3b 0a 20 20 20 20 72 65 61 64  LUSIVE;.    read
20100 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73  Only = (vfsFlags
20110 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
20120 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DONLY);.  }..  /
20130 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
20140 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74  call to PagerSet
20150 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65  Pagesize() serve
20160 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  s to set the val
20170 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65  ue of .  ** Page
20180 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74  r.pageSize and t
20190 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
201a0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
201b0 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  uffer..  */.  if
201c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
201d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
201e0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
201f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
20200 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
20210 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50  ize(pPager, &szP
20220 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20  ageDflt, -1);.  
20230 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
20240 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
20250 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
20260 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65  or occurred in e
20270 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f  ither of the blo
20280 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20  cks above, free 
20290 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20  the .  ** Pager 
202a0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
202b0 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
202c0 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
202d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
202e0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70  sert( !pPager->p
202f0 54 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20  TmpSpace );.    
20300 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
20310 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
20320 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
20330 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
20340 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
20350 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43  nitialize the PC
20360 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  ache object. */.
20370 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
20380 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72  <1000 );.  nExtr
20390 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
203a0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  a);.  sqlite3Pca
203b0 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
203c0 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
203d0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
203e0 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
203f0 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
20400 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
20410 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
20420 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
20430 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
20440 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
20450 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
20460 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  >zFilename));.  
20470 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
20480 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
20490 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
204a0 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e  me))..  pPager->
204b0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
204c0 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  )useJournal;.  p
204d0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
204e0 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20  k = (noReadlock 
204f0 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a  && readOnly) ?1:
20500 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  0;.  /* pPager->
20510 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
20520 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20530 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
20540 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
20550 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
20560 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
20570 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f  = (u8)memDb;.  /
20580 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
20590 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
205a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
205b0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
205c0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
205d0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
205e0 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
205f0 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
20600 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
20610 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
20620 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ; */.  assert( p
20630 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
20640 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
20650 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
20660 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20  GER_UNLOCK) );. 
20670 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
20680 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
20690 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
206a0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
206b0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
206c0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
206d0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
206e0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
206f0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
20700 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
20710 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
20720 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
20730 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
20740 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
20750 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
20760 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
20770 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
20780 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
20790 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
207a0 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
207b0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
207c0 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
207d0 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
207e0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
207f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 75 73   */.  assert( us
20800 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
20810 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
20820 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
20830 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
20840 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
20850 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72  ullSync = pPager
20860 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20  ->noSync ?0:1;. 
20870 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
20880 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
20890 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70  C_NORMAL;.  /* p
208a0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
208b0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
208c0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
208d0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
208e0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
208f0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
20900 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
20910 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
20920 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
20930 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
20940 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
20950 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
20960 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
20970 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
20980 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
20990 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
209a0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
209b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
209c0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
209d0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
209e0 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
209f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
20a00 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
20a10 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
20a20 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
20a30 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
20a40 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
20a50 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
20a60 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
20a70 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  /.  pPager->xRei
20a80 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
20a90 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
20aa0 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
20ab0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
20ac0 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50  ash)); */.  *ppP
20ad0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
20ae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20af0 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  K;.}..../*.** Th
20b00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20b10 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e  alled after tran
20b20 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50  sitioning from P
20b30 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a  AGER_UNLOCK to.*
20b40 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  * PAGER_SHARED s
20b50 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69  tate. It tests i
20b60 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
20b70 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74   journal present
20b80 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d   in.** the file-
20b90 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67  system for the g
20ba0 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f  iven pager. A ho
20bb0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
20bc0 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20   that .** needs 
20bd0 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
20be0 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20  k. According to 
20bf0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
20c00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   hot-journal.** 
20c10 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74  file exists if t
20c20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
20c30 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a  teria are met:.*
20c40 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75  *.**   * The jou
20c50 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
20c60 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73   in the file sys
20c70 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  tem, and.**   * 
20c80 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  No process holds
20c90 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
20ca0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
20cb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20cc0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
20cd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20ce0 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72  tself is greater
20cf0 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e   than 0 bytes in
20d00 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   size, and.**   
20d10 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
20d20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
20d30 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
20d40 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a  is not 0x00..**.
20d50 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
20d60 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
20d70 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
20d80 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
20d90 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
20da0 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
20db0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
20dc0 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
20dd0 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
20de0 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
20df0 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
20e00 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
20e10 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64  ile is.** just d
20e20 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44  eleted using OsD
20e30 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20  elete, *pExists 
20e40 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
20e50 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
20e60 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
20e70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
20e80 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74  s not check if t
20e90 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72  here is a master
20ea0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
20eb0 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  e.** at the end 
20ec0 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  of the file. If 
20ed0 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68  there is, and th
20ee0 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  at master journa
20ef0 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e  l file.** does n
20f00 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74  ot exist, then t
20f10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20f20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
20f30 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61  t. In this.** ca
20f40 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
20f50 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61  will return a fa
20f60 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68  lse-positive. Th
20f70 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
20f80 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69  ().** routine wi
20f90 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74  ll discover that
20fa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20fb0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
20fc0 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c  hot and .** will
20fd0 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63   not roll it bac
20fe0 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68  k. .**.** If a h
20ff0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
21000 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73  is found to exis
21010 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  t, *pExists is s
21020 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20  et to 1 and .** 
21030 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
21040 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f  ed. If no hot-jo
21050 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
21060 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20  esent, *pExists 
21070 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61  is.** set to 0 a
21080 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
21090 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
210a0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
210b0 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
210c0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
210d0 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a  r or not a hot-j
210e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
210f0 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  ts, the IO error
21100 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75  .** code is retu
21110 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  rned and the val
21120 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69  ue of *pExists i
21130 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
21140 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f  static int hasHo
21150 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
21160 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78  pPager, int *pEx
21170 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  ists){.  sqlite3
21180 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
21190 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
211a0 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
211d0 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73   */.  int exists
211e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
211f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
21200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
21210 20 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 61   present */..  a
21220 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
21230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21240 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
21250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
21260 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
21270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69   );.  assert( !i
21280 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
21290 64 29 20 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74  d) );..  *pExist
212a0 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  s = 0;.  rc = sq
212b0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
212c0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
212d0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
212e0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
212f0 73 74 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  sts);.  if( rc==
21300 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69  SQLITE_OK && exi
21310 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  sts ){.    int l
21320 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20  ocked;          
21330 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
21340 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
21350 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
21360 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  lock */..    /* 
21370 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68  Race condition h
21380 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72  ere:  Another pr
21390 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65  ocess might have
213a0 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68   been holding th
213b0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53  e.    ** the RES
213c0 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68  ERVED lock and h
213d0 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70  ave a journal op
213e0 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65  en at the sqlite
213f0 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20  3OsAccess() .   
21400 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20   ** call above, 
21410 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20  but then delete 
21420 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
21430 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65  drop the lock be
21440 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67  fore.    ** we g
21450 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  et to the follow
21460 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65  ing sqlite3OsChe
21470 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
21480 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a   call.  If that.
21490 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61      ** is the ca
214a0 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  se, this routine
214b0 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65   might think the
214c0 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
214d0 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  nal when.    ** 
214e0 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73  in fact there is
214f0 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73   none.  This res
21500 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d  ults in a false-
21510 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77  positive which w
21520 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65  ill.    ** be de
21530 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20  alt with by the 
21540 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65  playback routine
21550 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e  .  Ticket #3883.
21560 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
21570 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
21580 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67  eservedLock(pPag
21590 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29  er->fd, &locked)
215a0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
215b0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b  LITE_OK && !lock
215c0 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ed ){.      int 
215d0 6e 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  nPage;..      /*
215e0 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20   Check the size 
215f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21600 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73  file. If it cons
21610 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c  ists of 0 pages,
21620 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64  .      ** then d
21630 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
21640 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20  l file. See the 
21650 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61  header comment a
21660 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20  bove for .      
21670 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67  ** the reasoning
21680 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74   here.  Delete t
21690 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  he obsolete jour
216a0 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20  nal file under. 
216b0 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56       ** a RESERV
216c0 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64  ED lock to avoid
216d0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
216e0 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69   and to avoid vi
216f0 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  olating.      **
21700 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20   [H33020]..     
21710 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
21720 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
21730 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
21740 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
21750 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21760 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61  .        if( nPa
21770 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
21780 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
21790 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
217a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
217b0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
217c0 52 5f 52 45 53 45 52 56 45 44 0a 20 20 20 20 20  R_RESERVED.     
217d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 20              ||  
217e0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
217f0 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
21800 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
21810 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
21820 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
21830 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
21840 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
21850 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
21860 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21870 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
21880 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21890 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
218a0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
218b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
218c0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
218d0 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
218e0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
218f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21900 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
21910 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
21920 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  loc();.        }
21930 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21940 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
21950 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e  ile exists and n
21960 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
21970 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65  on has a reserve
21980 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
21990 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
219a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
219b0 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74  ile. Now check t
219c0 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20  hat there is.   
219d0 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61         ** at lea
219e0 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20  st one non-zero 
219f0 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61  bytes at the sta
21a00 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
21a10 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
21a20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
21a30 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64  , then we consid
21a40 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  er this journal 
21a50 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f  to be hot. If no
21a60 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  t, .          **
21a70 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   it can be ignor
21a80 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
21a90 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
21aa0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
21ab0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
21ac0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
21ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21ae0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
21af0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
21b00 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
21b10 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20  fd, f, &f);.    
21b20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21b30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21b40 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20         u8 first 
21b50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
21b60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
21b70 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
21b80 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c   (void *)&first,
21b90 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
21ba0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21bb0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
21bc0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
21bd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21be0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
21bf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
21c00 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
21c10 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
21c20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
21c30 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20   = (first!=0);. 
21c40 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
21c50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
21c60 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
21c70 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
21c80 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72  annot open the r
21c90 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
21ca0 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
21cb0 20 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20   see if.        
21cc0 20 20 20 20 2a 2a 20 69 74 73 20 68 61 73 20 61      ** its has a
21cd0 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68   zero header, th
21ce0 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  at might be due 
21cf0 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c  to an I/O error,
21d00 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20   or.            
21d10 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 64  ** it might be d
21d20 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20 63  ue to the race c
21d30 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
21d40 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a  ed above and in.
21d50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
21d60 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69  icket #3883.  Ei
21d70 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65  ther way, assume
21d80 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
21d90 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20  l is hot..      
21da0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
21db0 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20 70  ght be a false p
21dc0 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69 66  ositive.  But if
21dd0 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65   it is, then the
21de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21df0 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61  automatic journa
21e00 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72  l playback and r
21e10 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73  ecovery mechanis
21e20 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20  m will deal.    
21e30 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
21e40 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c  it under an EXCL
21e50 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65  USIVE lock where
21e60 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
21e70 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  to.            *
21e80 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20  * worry so much 
21e90 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74  with race condit
21ea0 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20  ions..          
21eb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
21ec0 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20   *pExists = 1;. 
21ed0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21ee0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
21ef0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21f10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
21f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  .}../*.** Read t
21f30 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
21f40 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
21f50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21f60 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
21f70 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
21f80 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
21f90 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
21fa0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
21fb0 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
21fc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
21fd0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
21fe0 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
21ff0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
22000 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
22010 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
22020 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
22030 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
22040 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
22050 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
22060 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
22070 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
22080 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
22090 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
220a0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
220b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
220c0 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
220d0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
220e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
220f0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
22100 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
22110 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
22120 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
22130 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
22140 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
22150 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
22160 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
22190 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 73 65   */.  i64 iOffse
221a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
221b0 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
221c0 74 20 6f 66 20 66 69 6c 65 20 74 6f 20 72 65 61  t of file to rea
221d0 64 20 66 72 6f 6d 20 2a 2f 0a 0a 20 20 61 73 73  d from */..  ass
221e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
221f0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
22200 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
22210 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
22220 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
22230 20 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70   if( NEVER(!isOp
22240 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
22250 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22260 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
22270 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
22280 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
22290 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
222a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
222b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66 66  E_OK;.  }.  iOff
222c0 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
222d0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
222e0 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
222f0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
22300 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
22310 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
22320 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  ize, iOffset);. 
22330 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22340 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
22350 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
22360 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
22370 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
22380 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
22390 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
223a0 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d 65  ata)[24];.    me
223b0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
223c0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
223d0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61  Vers, sizeof(pPa
223e0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
223f0 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28  );.  }.  CODEC1(
22400 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
22410 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20  ta, pgno, 3, rc 
22420 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  = SQLITE_NOMEM);
22430 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
22440 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
22450 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
22460 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
22470 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
22480 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
22490 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
224a0 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
224b0 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
224c0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
224d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
224e0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
224f0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
22500 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
22510 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22520 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22530 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
22540 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
22550 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
22560 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
22570 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
22580 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
22590 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69  erAcquire() unti
225a0 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
225b0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
225c0 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
225d0 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
225e0 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
225f0 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
22600 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
22610 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
22620 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
22630 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
22640 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
22650 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
22660 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
22670 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
22680 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
22690 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
226a0 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
226b0 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
226c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
226d0 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
226e0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
226f0 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
22700 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
22710 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22720 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
22730 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
22740 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
22750 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
22760 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
22770 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
22780 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
22790 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
227a0 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
227b0 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
227c0 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
227d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
227e0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
227f0 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
22800 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
22810 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
22820 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
22830 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
22840 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
22850 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
22860 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
22870 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
22880 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
22890 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
228a0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
228b0 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
228c0 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
228d0 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
228e0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
228f0 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
22900 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
22910 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
22920 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
22930 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
22940 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
22950 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
22960 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
22970 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
22980 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
22990 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
229a0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
229b0 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
229c0 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
229d0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
229e0 28 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  (2) above is not
229f0 20 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20   attempted, and 
22a00 69 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20  if the.** pager 
22a10 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
22a20 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
22a30 53 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e  SQLITE_FULL when
22a40 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
22a50 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74  .** the error st
22a60 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
22a70 73 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69  s returned. It i
22a80 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72  s permitted to r
22a90 65 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ead the.** datab
22aa0 61 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49  ase when in SQLI
22ab0 54 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74  TE_FULL error st
22ac0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ate..**.** Other
22ad0 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68  wise, if everyth
22ae0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
22af0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
22b00 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a  returned. If an.
22b10 2a 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  ** IO error occu
22b20 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67  rs while locking
22b30 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63   the database, c
22b40 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f  hecking for a ho
22b50 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
22b60 65 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  e or rolling bac
22b70 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
22b80 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
22b90 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
22ba0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22bb0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
22bc0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22bd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22be0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
22bf0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22c00 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72  de */.  int isEr
22c10 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20  rorReset = 0;   
22c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
22c30 75 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67  ue if recovering
22c40 20 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74   from error stat
22c50 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e */..  /* If th
22c60 69 73 20 64 61 74 61 62 61 73 65 20 68 61 73 20  is database has 
22c70 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
22c80 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61  age references a
22c90 6e 64 20 69 73 20 69 6e 20 61 6e 20 0a 20 20 2a  nd is in an .  *
22ca0 2a 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74  * error-state, t
22cb0 68 69 73 20 69 73 20 61 20 63 68 61 6e 63 65 20  his is a chance 
22cc0 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  to clear the err
22cd0 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
22ce0 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  .  ** contents o
22cf0 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
22d00 65 20 61 6e 64 20 72 6f 6c 6c 62 61 63 6b 20 61  e and rollback a
22d10 6e 79 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69  ny hot journal i
22d20 6e 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 2d  n the.  ** file-
22d30 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69  system..  */.  i
22d40 66 28 20 21 4d 45 4d 44 42 20 26 26 20 73 71 6c  f( !MEMDB && sql
22d50 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
22d60 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
22d70 68 65 29 3d 3d 30 20 26 26 20 70 50 61 67 65 72  he)==0 && pPager
22d80 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
22d90 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
22da0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67  er->jfd) || pPag
22db0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a  er->zJournal ){.
22dc0 20 20 20 20 20 20 69 73 45 72 72 6f 72 52 65 73        isErrorRes
22dd0 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  et = 1;.    }.  
22de0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
22df0 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
22e00 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
22e10 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
22e20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
22e30 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72  s still in an er
22e40 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f  ror state, do no
22e50 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20 65  t proceed. The e
22e60 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74 65  rror .  ** state
22e70 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
22e80 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   at some point i
22e90 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 68 65  n the future whe
22ea0 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a  n all page .  **
22eb0 20 72 65 66 65 72 65 6e 63 65 73 20 61 72 65 20   references are 
22ec0 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65 20  dropped and the 
22ed0 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73  cache can be dis
22ee0 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  carded..  */.  i
22ef0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
22f00 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
22f10 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
22f20 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
22f30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
22f40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
22f50 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
22f60 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72  R_UNLOCK || isEr
22f70 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  rorReset ){.    
22f80 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
22f90 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
22fa0 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  r->pVfs;.    int
22fb0 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20   isHotJournal = 
22fc0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  0;.    assert( !
22fd0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
22fe0 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
22ff0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
23000 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
23010 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
23020 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b  r->noReadlock ){
23030 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
23040 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
23050 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
23060 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
23070 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23080 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23090 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
230a0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
230b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
230c0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
230d0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
230e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
230f0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
23100 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
23110 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
23120 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
23130 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23140 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
23150 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
23160 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
23170 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
23180 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
23190 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
231a0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
231b0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
231c0 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
231d0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
231e0 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
231f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
23200 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
23210 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
23220 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
23230 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b   &isHotJournal);
23240 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
23250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23260 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
23270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23280 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65     if( isErrorRe
23290 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72  set || isHotJour
232a0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
232b0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
232c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
232d0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
232e0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
232f0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
23300 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
23310 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
23320 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
23330 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
23340 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
23350 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
23360 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
23370 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
23380 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
23390 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
233a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
233b0 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
233c0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
233d0 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
233e0 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
233f0 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
23400 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20  ill rolling the 
23410 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f  .      ** hot-jo
23420 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20  urnal back..    
23430 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42    ** .      ** B
23440 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
23450 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
23460 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
23470 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20  uested, any.    
23480 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65    ** other proce
23490 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ss attempting to
234a0 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
234b0 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67  base file will g
234c0 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  et to .      ** 
234d0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
234e0 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
234f0 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  to obtain its ow
23500 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
23510 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68   .      ** on th
23520 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
23530 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23540 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
23550 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
23560 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23570 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
23580 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
23590 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
235a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
235b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
235c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
235d0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
235e0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
235f0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
23600 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
23610 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
23620 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
23630 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70   }. .      /* Op
23640 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
23650 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
23660 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
23670 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
23680 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
23690 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
236a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
236b0 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
236c0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  nd.      ** poss
236d0 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
236e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
236f0 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
23700 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
23710 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29   ** OsTruncate()
23720 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78   call used in ex
23730 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
23740 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65  ode also require
23750 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61  s.      ** a rea
23760 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
23770 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dle..      */.  
23780 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
23790 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
237a0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b          int res;
237b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
237c0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
237d0 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  fs,pPager->zJour
237e0 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53  nal,SQLITE_ACCES
237f0 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a  S_EXISTS,&res);.
23800 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
23810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23820 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29         if( res )
23830 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
23840 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
23850 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
23860 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23870 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
23880 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
23890 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
238a0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
238b0 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
238c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
238d0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
238e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
238f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
23900 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
23910 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
23920 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
23930 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
23940 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
23950 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23960 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
23970 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
23980 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23990 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
239a0 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  OPEN;.          
239b0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
239c0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
239d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
239e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
239f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23a00 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
23a10 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
23a20 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
23a30 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
23a40 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63        ** other c
23a50 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65  onnection manage
23a60 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20  d to get in and 
23a70 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66  roll it back bef
23a80 6f 72 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ore .           
23a90 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   ** this connect
23aa0 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65  ion obtained the
23ab0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
23ac0 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20  above. Or, it . 
23ad0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61             ** ma
23ae0 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
23af0 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
23b00 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
23b10 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
23b20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77     ** function w
23b30 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68  as called and th
23b40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
23b50 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  oes not exist.  
23b60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
23b70 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
23b80 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
23b90 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
23ba0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
23bb0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
23bc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23bd0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
23be0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
23bf0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 79 20     /* TODO: Why 
23c00 61 72 65 20 74 68 65 73 65 20 63 6c 65 61 72 65  are these cleare
23c10 64 20 68 65 72 65 3f 20 49 73 20 69 74 20 6e 65  d here? Is it ne
23c20 63 65 73 73 61 72 79 3f 20 2a 2f 0a 20 20 20 20  cessary? */.    
23c30 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
23c40 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
23c50 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
23c60 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
23c70 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
23c80 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
23c90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
23ca0 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f  r = 0;. .      /
23cb0 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
23cc0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
23cd0 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
23ce0 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
23cf0 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
23d00 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
23d10 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65   lock. Purge the
23d20 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20   cache before.  
23d30 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62      ** playing b
23d40 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ack the hot-jour
23d50 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64  nal so that we d
23d60 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68  on't end up with
23d70 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  .      ** an inc
23d80 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
23d90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23da0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
23db0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
23dc0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
23dd0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
23de0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
23df0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23e00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
23e10 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
23e20 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
23e30 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
23e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23e50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
23e60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
23e70 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
23e80 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
23e90 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
23ea0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
23eb0 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
23ec0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
23ed0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23ee0 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69  >pBackup || sqli
23ef0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
23f00 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
23f10 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  he)>0 ){.      /
23f20 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
23f30 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
23f40 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
23f50 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
23f60 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
23f70 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
23f80 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
23f90 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
23fa0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
23fb0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
23fc0 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
23fd0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
23fe0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
23ff0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
24000 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
24010 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
24020 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
24030 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
24040 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
24050 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
24060 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
24070 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
24080 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
24090 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
240a0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
240b0 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
240c0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
240d0 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
240e0 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
240f0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
24100 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
24110 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
24120 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
24130 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
24140 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
24150 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
24160 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
24170 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
24180 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
24190 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
241a0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
241b0 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
241c0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
241d0 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
241e0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
241f0 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
24200 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
24210 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
24220 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
24230 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  /.      char dbF
24240 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
24250 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
24260 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
24270 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
24280 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20  (pPager, 0);..  
24290 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
242a0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
242b0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
242c0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
242d0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
242e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
242f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
24300 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  izeValid );.    
24310 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
24320 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
24330 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
24340 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
24350 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
24360 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
24370 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24380 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
24390 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
243a0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
243b0 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
243c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
243d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
243e0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
243f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
24400 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
24410 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
24420 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
24430 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
24440 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
24450 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
24460 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
24470 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
24480 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
24490 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
244a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
244b0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
244c0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
244d0 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
244e0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
244f0 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66  HARED );.  }.. f
24500 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
24510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24520 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    /* pager_unloc
24530 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
24540 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  or exclusive mod
24550 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  e and in-memory 
24560 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
24570 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
24580 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
24590 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
245a0 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
245b0 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
245c0 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
245d0 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
245e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
245f0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
24600 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
24610 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
24620 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
24630 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
24640 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
24650 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
24660 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
24670 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
24680 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
24690 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
246a0 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
246b0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
246c0 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
246d0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
246e0 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
246f0 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33  {.  if( (sqlite3
24700 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
24710 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
24720 3d 30 29 0a 20 20 20 26 26 20 28 21 70 50 61 67  =0).   && (!pPag
24730 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
24740 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
24750 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b  rnalOff>0) .  ){
24760 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
24770 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
24780 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
24790 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65  * Acquire a refe
247a0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75  rence to page nu
247b0 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67  mber pgno in pag
247c0 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67  er pPager (a pag
247d0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68  e.** reference h
247e0 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29  as type DbPage*)
247f0 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
24800 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
24810 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
24820 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
24830 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
24840 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
24850 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
24860 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
24870 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
24880 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
24890 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
248a0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
248b0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
248c0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
248d0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
248e0 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
248f0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
24900 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
24910 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
24920 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
24930 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
24940 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
24950 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
24960 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
24970 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
24980 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
24990 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
249a0 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
249b0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
249c0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
249d0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
249e0 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
249f0 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
24a00 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
24a10 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
24a20 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
24a30 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
24a40 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
24a50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
24a60 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
24a70 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
24a80 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
24a90 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
24aa0 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
24ab0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
24ac0 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
24ad0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
24ae0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
24af0 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
24b00 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
24b10 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
24b20 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
24b30 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
24b40 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
24b50 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
24b60 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
24b70 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
24b80 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
24b90 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
24ba0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
24bb0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
24bc0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
24bd0 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
24be0 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
24bf0 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
24c00 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
24c10 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
24c20 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
24c30 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
24c40 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65  occurs in two se
24c50 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73  perate scenarios
24c60 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65  :.**.**   a) Whe
24c70 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65  n reading a free
24c80 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
24c90 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
24ca0 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62  e, and.**.**   b
24cb0 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  ) When a savepoi
24cc0 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  nt is being roll
24cd0 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e  ed back and we n
24ce0 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20  eed to load.**  
24cf0 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69      a new page i
24d00 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f  nto the cache to
24d10 20 70 6f 70 75 6c 61 74 65 20 77 69 74 68 20 74   populate with t
24d20 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
24d30 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
24d40 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
24d50 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
24d60 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
24d70 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
24d80 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
24d90 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
24da0 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
24db0 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
24dc0 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
24dd0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
24de0 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
24df0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
24e00 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
24e10 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
24e20 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
24e30 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
24e40 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
24e50 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
24e60 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
24e70 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
24e80 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
24e90 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
24ea0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
24eb0 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
24ec0 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
24ed0 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
24ee0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
24ef0 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
24f00 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
24f10 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
24f20 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
24f30 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
24f40 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
24f50 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
24f60 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
24f70 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
24f80 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
24f90 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
24fa0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
24fb0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
24fc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
24fd0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
24fe0 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
24ff0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
25000 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
25010 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
25020 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
25030 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
25040 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
25050 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
25060 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
25070 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
25080 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
25090 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
250a0 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
250b0 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
250c0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
250d0 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
250e0 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
250f0 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
25100 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
25110 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
25120 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
25130 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
25140 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
25150 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
25160 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
25170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
25180 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
25190 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
251a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
251b0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
251c0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
251d0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
251e0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
251f0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
25200 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
25210 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
25220 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
25230 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
25240 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
25250 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
25260 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
25270 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
25280 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
25290 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
252a0 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
252b0 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ..  assert( asse
252c0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
252d0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
252e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
252f0 65 3e 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  e>PAGER_UNLOCK )
25300 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  ;..  if( pgno==0
25310 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
25320 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25330 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
25340 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
25350 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
25360 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
25370 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a  r immediately. .
25380 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
25390 72 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65  request the page
253a0 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65   from the PCache
253b0 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28   layer. */.  if(
253c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
253d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  !=SQLITE_OK && p
253e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
253f0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
25400 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
25410 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65  errCode;.  }else
25420 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
25430 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
25440 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
25450 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b  gno, 1, ppPage);
25460 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
25470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25480 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63   /* Either the c
25490 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63  all to sqlite3Pc
254a0 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75  acheFetch() retu
254b0 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72  rned an error or
254c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
254d0 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e  r was already in
254e0 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
254f0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
25500 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a  ion was called..
25510 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74      ** Set pPg t
25520 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20  o 0 and jump to 
25530 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61  the exception ha
25540 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70  ndler.  */.    p
25550 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  Pg = 0;.    goto
25560 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
25570 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rr;.  }.  assert
25580 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
25590 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
255a0 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
255b0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
255c0 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  | (*ppPage)->pPa
255d0 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
255e0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
255f0 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  er ){.    /* In 
25600 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
25610 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
25620 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
25630 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
25640 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
25650 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
25660 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
25670 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
25680 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
25690 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
256a0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
256b0 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
256c0 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
256d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
256e0 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
256f0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
25700 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
25710 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
25720 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
25730 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
25740 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20  itialized.  */. 
25750 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20     int nMax;..  
25760 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
25770 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
25780 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a   pPg = *ppPage;.
25790 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
257a0 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f  = pPager;..    /
257b0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
257c0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
257d0 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
257e0 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
257f0 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ge.    ** number
25800 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
25810 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65  is, or the unuse
25820 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20  d locking-page, 
25830 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f  is requested. */
25840 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  .    if( pgno>PA
25850 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
25860 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
25870 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
25880 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25890 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
258a0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
258b0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
258c0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   }..    rc = sql
258d0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
258e0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78  nt(pPager, &nMax
258f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
25900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25910 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
25920 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
25930 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
25940 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
25950 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b   || noContent ){
25960 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
25970 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
25980 7b 0a 09 72 63 20 3d 20 53 51 4c 49 54 45 5f 46  {..rc = SQLITE_F
25990 55 4c 4c 3b 0a 09 67 6f 74 6f 20 70 61 67 65 72  ULL;..goto pager
259a0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
259b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
259c0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
259d0 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
259e0 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
259f0 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
25a00 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
25a10 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
25a20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
25a30 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
25a40 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
25a50 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
25a60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
25a70 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
25a80 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
25a90 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
25aa0 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
25ab0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
25ac0 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
25ad0 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
25ae0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
25af0 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
25b00 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
25b10 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
25b20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
25b30 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
25b40 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
25b50 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
25b60 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
25b70 72 69 67 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  rigSize) ){.    
25b80 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
25b90 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69  rc = ) sqlite3Bi
25ba0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
25bb0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
25bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
25bd0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
25be0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
25bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53     }.        TES
25c00 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
25c10 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
25c20 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ecs(pPager, pgno
25c30 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
25c40 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
25c50 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
25c60 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
25c70 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
25c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25c90 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
25ca0 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
25cb0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
25cc0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
25cd0 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
25ce0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
25cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25d00 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
25d10 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
25d20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
25d30 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
25d40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25d50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
25d60 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
25d70 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
25d80 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
25d90 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
25da0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
25db0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
25dc0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
25dd0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
25de0 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61  ITE_OK;..pager_a
25df0 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73  cquire_err:.  as
25e00 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
25e10 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67  _OK );.  if( pPg
25e20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
25e30 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
25e40 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
25e50 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
25e60 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  );..  *ppPage = 
25e70 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
25e80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
25e90 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
25ea0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
25eb0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
25ec0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
25ed0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
25ee0 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
25ef0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
25f00 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
25f10 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
25f20 6e 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72  n cache. Also, r
25f30 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a  eturn 0 if the .
25f40 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  ** pager is in P
25f50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74  AGER_UNLOCK stat
25f60 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
25f70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
25f80 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67  ** or if the pag
25f90 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
25fa0 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
25fb0 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a  an SQLITE_FULL..
25fc0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
25fd0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
25fe0 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
25ff0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
26000 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
26010 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
26020 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
26030 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
26040 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
26050 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
26060 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
26070 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
26080 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
26090 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
260a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
260b0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
260c0 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
260d0 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
260e0 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
260f0 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
26100 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
26110 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
26120 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
26130 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  0;.  assert( pPa
26140 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
26150 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
26160 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26170 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
26180 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26190 3e 73 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55  >state > PAGER_U
261a0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  NLOCK );.  sqlit
261b0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
261c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
261d0 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
261e0 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a   return pPg;.}..
261f0 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
26200 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  page reference..
26210 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
26220 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
26230 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
26240 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
26250 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
26260 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
26270 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
26280 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
26290 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
262a0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
262b0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
262c0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
262d0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
262e0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  emoved..*/.void 
262f0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
26300 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
26310 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
26320 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
26330 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
26340 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
26350 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
26360 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
26370 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
26380 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  }.}../*.** If th
26390 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
263a0 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ile has already 
263b0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73  been opened, ens
263c0 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ure that the.** 
263d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
263e0 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66   is open too. If
263f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
26400 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a  l is not open,.*
26410 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
26420 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
26430 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
26440 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
26450 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
26460 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a  ding to plan. .*
26470 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  * An SQLITE_IOER
26480 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
26490 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
264a0 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71  a call to .** sq
264b0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61  lite3OsOpen() fa
264c0 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
264d0 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
264e0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
264f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26500 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 73  ITE_OK;.  if( is
26510 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26520 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61  ) && !isOpen(pPa
26530 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
26540 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
26550 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
26560 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
26570 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ORY || pPager->s
26580 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
26590 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
265a0 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
265b0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65  r->sjfd);.    }e
265c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
265d0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
265e0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a  ager, pPager->sj
265f0 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
26600 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
26610 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
26620 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
26630 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
26640 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
26650 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
26660 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
26670 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
26680 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
26690 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
266a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
266b0 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
266c0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
266d0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
266e0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
266f0 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
26700 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
26710 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
26720 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
26730 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
26740 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
26750 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
26760 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
26770 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
26780 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
26790 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
267a0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
267b0 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
267c0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
267d0 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
267e0 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
267f0 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
26800 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
26810 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
26820 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
26830 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
26840 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
26850 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
26860 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
26870 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
26880 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
26890 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
268a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
268b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
268c0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
268d0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
268e0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
268f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
26900 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
26910 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
26920 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
26930 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
26940 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
26950 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
26960 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
26970 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
26980 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
26990 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
269a0 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
269b0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
269c0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
269d0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
269e0 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
269f0 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
26a00 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
26a10 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
26a20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26a30 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
26a40 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
26a50 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26a60 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26a80 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
26a90 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
26aa0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
26ab0 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
26ac0 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
26ad0 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
26ae0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26af0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
26b00 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
26b10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
26b20 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
26b30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
26b40 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
26b50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
26b60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
26b70 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
26b80 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
26b90 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
26ba0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
26bb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
26bc0 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
26bd0 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
26be0 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
26bf0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
26c00 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
26c10 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
26c20 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
26c30 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
26c40 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
26c50 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
26c60 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a  ode;..  /* TODO:
26c70 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70 6f   Is it really po
26c80 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68 65  ssible to get he
26c90 72 65 20 77 69 74 68 20 64 62 53 69 7a 65 56 61  re with dbSizeVa
26ca0 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a  lid==0? If not,.
26cb0 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f    ** the call to
26cc0 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   PagerPagecount(
26cd0 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  ) can be removed
26ce0 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
26cf0 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e( pPager->dbSiz
26d00 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73  eValid==0 );.  s
26d10 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
26d20 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
26d30 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ..  pPager->pInJ
26d40 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
26d50 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
26d60 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
26d70 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
26d80 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
26d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
26da0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
26db0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
26dc0 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e   file if it is n
26dd0 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
26de0 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
26df0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
26e00 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
26e10 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
26e20 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26e30 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
26e40 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
26e50 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
26e60 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
26e70 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
26e80 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
26e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
26ea0 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
26eb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
26ec0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
26ed0 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
26ee0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
26ef0 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72  .        (pPager
26f00 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20  ->tempFile ? .  
26f10 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
26f20 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
26f30 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
26f40 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20  EMP_JOURNAL):.  
26f50 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
26f60 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
26f70 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69  L).        );.#i
26f80 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
26f90 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
26fa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26fb0 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
26fc0 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
26fd0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
26fe0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
26ff0 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53  ags, jrnlBufferS
27000 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20  ize(pPager).    
27010 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20    );.#else.     
27020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
27030 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
27040 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
27050 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
27060 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
27070 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
27080 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
27090 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
270a0 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  ) );.  }...  /* 
270b0 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
270c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
270d0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
270e0 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a  le and open .  *
270f0 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
27100 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
27110 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
27120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27130 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
27140 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
27150 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
27160 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ed. */.    pPage
27170 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
27180 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
27190 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
271a0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
271b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
271c0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  Sync = 0;.    pP
271d0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
271e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
271f0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
27200 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
27210 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  r = 0;.    pPage
27220 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
27230 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  0;.    rc = writ
27240 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
27250 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
27260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27270 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
27280 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f  nt ){.    rc = o
27290 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
272a0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
272b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
272c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
272d0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
272e0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
272f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
27300 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
27310 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27320 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
27330 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
27340 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
27350 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
27360 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
27370 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
27380 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
27390 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
273a0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
273b0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
273c0 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
273d0 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
273e0 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
273f0 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
27400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27410 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
27420 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
27430 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
27440 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
27450 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
27460 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
27470 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
27480 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
27490 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
274a0 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
274b0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
274c0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61  in-memory file a
274d0 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nd, the journal 
274e0 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e  file is .** open
274f0 65 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  ed if it has not
27500 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46   been already. F
27510 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  or a temporary f
27520 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  ile, the opening
27530 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72   .** of the jour
27540 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
27550 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
27560 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65   is an actual ne
27570 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20  ed to .** write 
27580 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
27590 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65  TODO: Why handle
275a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
275b0 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a   differently?.**
275c0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
275d0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
275e0 64 20 28 6f 72 20 69 66 20 69 74 20 69 73 20 61  d (or if it is a
275f0 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68  lready open), th
27600 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  en a.** journal-
27610 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
27620 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  n to the start o
27630 66 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  f it..**.** If t
27640 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
27650 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
27660 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73  zero, then any s
27670 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65  ub-journal opene
27680 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  d.** within this
27690 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
276a0 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61  l be opened as a
276b0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
276c0 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f  . This.** has no
276d0 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73   effect if the s
276e0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  ub-journal is al
276f0 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73  ready opened (as
27700 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a   it may be when.
27710 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ** running in ex
27720 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72  clusive mode) or
27730 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
27740 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  ion does not req
27750 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f  uire a.** sub-jo
27760 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75  urnal. If the su
27770 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
27780 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ent is zero, the
27790 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a  n any required.*
277a0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  * sub-journal is
277b0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d   implemented in-
277c0 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72  memory if pPager
277d0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
277e0 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f   database, .** o
277f0 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72  r using a tempor
27800 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69  ary file otherwi
27810 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
27820 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67  e3PagerBegin(Pag
27830 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
27840 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a  exFlag, int subj
27850 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74  InMemory){.  int
27860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27870 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27880 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
27890 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  UNLOCK );.  asse
278a0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
278b0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 70 50 61 67  ournal );.  pPag
278c0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
278d0 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
278e0 6f 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ory;.  if( pPage
278f0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
27900 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
27910 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
27920 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
27930 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
27940 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  B && !pPager->te
27950 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f  mpFile );..    /
27960 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52  * Obtain a RESER
27970 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
27980 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
27990 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72  f the exFlag par
279a0 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69 73  ameter.    ** is
279b0 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
279c0 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
279d0 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
279e0 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
279f0 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
27a00 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
27a10 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
27a20 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
27a30 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c  CLUSIVE.    ** l
27a40 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
27a50 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
27a60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
27a70 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
27a80 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
27a90 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
27aa0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
27ab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27ac0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
27ad0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
27ae0 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66  SERVED;.      if
27af0 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
27b00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
27b10 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
27b20 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
27b30 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
27b40 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
27b50 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
27b60 20 77 65 72 65 20 73 75 63 63 65 73 73 66 75 6c   were successful
27b70 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70 65  ly obtained, ope
27b80 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
27b90 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77 72    ** file and wr
27ba0 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
27bb0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f 20  urnal-header to 
27bc0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
27bd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27be0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
27bf0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
27c00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
27c10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
27c20 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
27c30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
27c40 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
27c50 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
27c60 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
27c70 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lOff==0 ){.    /
27c80 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  * This happens w
27c90 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61  hen the pager wa
27ca0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  s in exclusive-a
27cb0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c  ccess mode the l
27cc0 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20  ast.    ** time 
27cd0 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65  a (read or write
27ce0 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  ) transaction wa
27cf0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
27d00 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20  oncluded.    ** 
27d10 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  by this connecti
27d20 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  on. Instead of d
27d30 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  eleting the jour
27d40 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20  nal file it was 
27d50 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65  .    ** kept ope
27d60 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61 73  n and either was
27d70 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20   truncated to 0 
27d80 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65 61  bytes or its hea
27d90 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f  der was.    ** o
27da0 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
27db0 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
27dc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27dd0 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  ->nRec==0 );.   
27de0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27df0 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29  >dbOrigSize==0 )
27e00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
27e10 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27e20 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
27e30 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
27e40 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
27e50 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
27e60 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
27e70 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
27e80 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r)));.  assert( 
27e90 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
27ea0 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
27eb0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
27ec0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
27ed0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27ee0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
27ef0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d  rt( !pPager->dbM
27f00 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20 20 2f  odified );.    /
27f10 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20  * Ignore any IO 
27f20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
27f30 73 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 65  s within pager_e
27f40 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 29  nd_transaction()
27f50 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 75 72  . The.    ** pur
27f60 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63 61 6c  pose of this cal
27f70 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20 74 68  l is to reset th
27f80 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
27f90 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a 20 20   of the pager.  
27fa0 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65 6d 2e    ** sub-system.
27fb0 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 74   It doesn't matt
27fc0 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  er if the journa
27fd0 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 72  l-file is not pr
27fe0 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20 66 69  operly.    ** fi
27ff0 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69 73 20  nalized at this 
28000 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69 74 20  point (since it 
28010 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6a  is not a valid j
28020 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 79 77  ournal file anyw
28030 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ay)..    */.    
28040 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
28050 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29  ction(pPager, 0)
28060 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28070 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
28080 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
28090 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
280a0 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
280b0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
280c0 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
280d0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
280e0 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
280f0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
28100 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
28110 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
28120 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
28130 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
28140 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
28150 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
28160 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
28170 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
28180 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
28190 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
281a0 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
281b0 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
281c0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
281d0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76  PgHdr *pPg){.  v
281e0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
281f0 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72  ->pData;.  Pager
28200 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
28210 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
28220 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
28230 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
28240 68 61 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75  has been previou
28250 73 6c 79 20 64 65 74 65 63 74 65 64 2c 20 77 65  sly detected, we
28260 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 0a 20   should not be. 
28270 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   ** calling this
28280 20 72 6f 75 74 69 6e 65 2e 20 20 52 65 70 65 61   routine.  Repea
28290 74 20 74 68 65 20 65 72 72 6f 72 20 66 6f 72 20  t the error for 
282a0 72 6f 62 75 73 74 6e 65 73 73 2e 0a 20 20 2a 2f  robustness..  */
282b0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
282c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
282d0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
282e0 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48  errCode;..  /* H
282f0 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74  igher-level rout
28300 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20  ines never call 
28310 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
28320 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
28330 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20  .  ** writable. 
28340 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61   But check anywa
28350 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75  y, just for robu
28360 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
28370 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72   NEVER(pPager->r
28380 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  eadOnly) ) retur
28390 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a  n SQLITE_PERM;..
283a0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
283b0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
283c0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
283d0 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
283e0 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
283f0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
28400 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
28410 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
28420 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
28430 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
28440 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
28450 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
28460 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
28470 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e   if( pageInJourn
28480 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a  al(pPg) && !subj
28490 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
284a0 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
284b0 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
284c0 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
284d0 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
284e0 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
284f0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
28500 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
28510 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
28520 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
28530 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
28540 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
28550 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
28560 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
28570 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
28580 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
28590 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
285a0 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
285b0 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
285c0 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
285d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
285e0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
285f0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
28600 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
28610 67 69 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 70  gin(pPager, 0, p
28620 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
28630 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ory);.    if( rc
28640 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28650 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
28660 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
28670 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
28680 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
28690 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  );.    if( !isOp
286a0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
286b0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
286c0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
286d0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
286e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
286f0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
28700 6c 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  l );.      rc = 
28710 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
28720 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
28730 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28740 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
28750 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
28760 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
28770 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  1;.  .    /* The
28780 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
28790 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
287a0 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
287b0 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
287c0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
287d0 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
287e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
287f0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
28800 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
28810 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
28820 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
28830 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
28840 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
28850 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61  f( !pageInJourna
28860 6c 28 70 50 67 29 20 26 26 20 69 73 4f 70 65 6e  l(pPg) && isOpen
28870 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
28880 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
28890 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
288a0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
288b0 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
288c0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
288d0 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ta2;..        /*
288e0 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
288f0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
28900 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
28910 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
28920 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
28930 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
28940 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
28950 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
28960 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
28970 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
28980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
28990 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
289a0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
289b0 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32  ;.        CODEC2
289c0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
289d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
289e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
289f0 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
28a00 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
28a10 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
28a20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
28a30 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
28a40 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
28a50 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
28a60 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  nalOff, pPg->pgn
28a70 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
28a80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28a90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28aa0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
28ab0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
28ac0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
28ad0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
28b00 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20  nalOff + 4);.   
28b10 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28b20 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
28b30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b  ger->pageSize+4;
28b40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28b50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28b60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28b70 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
28b80 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
28b90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28ba0 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  ff, cksum);.    
28bb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
28bc0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
28bd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28be0 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
28bf0 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
28c00 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
28c10 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
28c20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28c30 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
28c40 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
28c50 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
28c60 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
28c70 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
28c80 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28c90 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
28ca0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
28cb0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
28cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50  ,.             P
28cd0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
28ce0 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
28cf0 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
28d00 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
28d10 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
28d20 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
28d30 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ));..        /* 
28d40 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
28d50 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
28d60 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a  occurred while j
28d70 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
28d80 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
28d90 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
28da0 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
28db0 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
28dc0 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
28dd0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
28de0 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
28df0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
28e00 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
28e10 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
28e20 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
28e30 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
28e40 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
28e50 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
28e60 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
28e70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
28e80 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
28e90 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
28ea0 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
28eb0 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
28ec0 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
28ed0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28ee0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
28ef0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
28f00 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
28f10 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28f20 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
28f30 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
28f40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
28f50 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72       /* An error
28f60 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 77 72   has occurred wr
28f70 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
28f80 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a  rnal file. The .
28f90 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
28fa0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
28fb0 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
28fc0 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
28fd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28fe0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28ff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
29000 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29010 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70      }..        p
29020 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
29030 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
29040 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
29050 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
29060 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
29070 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
29080 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
29090 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
290a0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
290b0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
290c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
290d0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
290e0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
290f0 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61  .        rc |= a
29100 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
29110 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
29120 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
29130 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29140 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29150 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
29160 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
29170 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29180 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
291a0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
291b0 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
291c0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
291d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
291e0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
291f0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
29200 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
29210 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
29220 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
29230 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
29240 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
29250 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
29260 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
29270 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
29280 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
29290 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
292a0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
292b0 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20  YNC)?1:0)));.   
292c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
292d0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
292e0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
292f0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
29300 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
29310 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
29320 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
29330 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
29340 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
29350 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
29360 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
29370 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
29380 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
29390 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
293a0 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
293b0 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
293c0 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
293d0 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
293e0 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52  */.    if( subjR
293f0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
29400 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
29410 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
29420 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
29430 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
29440 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
29450 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
29460 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29470 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
29480 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61  RED );.  if( pPa
29490 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d  ger->dbSize<pPg-
294a0 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
294b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
294c0 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
294d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
294e0 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
294f0 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
29500 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
29510 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
29520 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20  fore .** making 
29530 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
29540 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  e. The caller mu
29550 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
29560 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  urn value .** of
29570 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
29580 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
29590 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20  t to change any 
295a0 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73  page data unless
295b0 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
295c0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
295d0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  _OK..**.** The d
295e0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
295f0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
29600 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
29610 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
29620 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
29630 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
29640 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
29650 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
29660 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
29670 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
29680 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
29690 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
296a0 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
296b0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
296c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
296d0 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
296e0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
296f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
29700 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
29710 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
29720 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
29730 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f  s appropriate. O
29740 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
29750 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
29760 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
29770 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
29780 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29790 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
297a0 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
297b0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
297c0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
297d0 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
297e0 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
297f0 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
29800 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
29810 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74  if( nPagePerSect
29820 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
29830 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
29840 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
29850 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
29860 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
29870 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
29880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29890 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
298a0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
298b0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
298c0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
298d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
298e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
298f0 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
29900 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
29910 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
29920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29930 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
29940 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  */.    int needS
29950 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ync = 0;        
29960 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
29970 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e  page has PGHDR_N
29980 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20  EED_SYNC */..   
29990 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
299a0 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
299b0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
299c0 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
299d0 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
299e0 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
299f0 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
29a00 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
29a10 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
29a20 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
29a30 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
29a40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
29a50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
29a60 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
29a70 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b  ->doNotSync = 1;
29a80 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
29a90 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
29aa0 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
29ab0 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
29ac0 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
29ad0 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
29ae0 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
29af0 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
29b00 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
29b10 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
29b20 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
29b30 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
29b40 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
29b50 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
29b60 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
29b70 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
29b80 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50  1;..    sqlite3P
29b90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
29ba0 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50  ager, (int *)&nP
29bb0 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69  ageCount);.    i
29bc0 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
29bd0 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
29be0 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
29bf0 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
29c00 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
29c10 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
29c20 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
29c30 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
29c40 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
29c50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29c60 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
29c70 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
29c80 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
29c90 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
29ca0 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
29cb0 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
29cc0 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
29cd0 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
29ce0 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
29cf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
29d00 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
29d10 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
29d20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
29d30 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70  .      if( pg==p
29d40 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c  Pg->pgno || !sql
29d50 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
29d60 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
29d70 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20  l, pg) ){.      
29d80 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
29d90 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
29da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
29db0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
29dc0 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
29dd0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29de0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29df0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29e00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
29e10 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
29e20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
29e30 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
29e40 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
29e50 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
29e60 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
29e70 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
29e80 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
29e90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29ea0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29eb0 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
29ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
29ed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29ee0 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
29ef0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
29f00 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
29f10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
29f20 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
29f30 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
29f40 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
29f50 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
29f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
29f70 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
29f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29f90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
29fa0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
29fb0 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61  lag is set for a
29fc0 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20  ny of the nPage 
29fd0 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74  pages .    ** st
29fe0 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74  arting at pg1, t
29ff0 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20  hen it needs to 
2a000 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f  be set for all o
2a010 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a  f them. Because.
2a020 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74      ** writing t
2a030 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e  o any of these n
2a040 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64  Page pages may d
2a050 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73  amage the others
2a060 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  , the.    ** jou
2a070 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63  rnal file must c
2a080 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20  ontain sync()ed 
2a090 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66  copies of all of
2a0a0 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66   them.    ** bef
2a0b0 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  ore any of them 
2a0c0 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
2a0d0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2a0e0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
2a0f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a100 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e  TE_OK && needSyn
2a110 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
2a120 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  t( !MEMDB && pPa
2a130 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29  ger->noSync==0 )
2a140 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
2a150 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b  ; ii<nPage; ii++
2a160 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
2a170 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   *pPage = pager_
2a180 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
2a190 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20  g1+ii);.        
2a1a0 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
2a1b0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c         pPage->fl
2a1c0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
2a1d0 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
2a1e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2a1f0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
2a200 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2a210 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
2a220 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r->needSync);.  
2a230 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
2a240 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
2a250 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  nc==1 );.    pPa
2a260 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
2a270 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2a280 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2a290 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
2a2a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a2b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2a2c0 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
2a2d0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
2a2e0 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
2a2f0 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
2a300 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a310 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
2a320 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
2a330 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
2a340 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
2a350 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
2a360 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
2a370 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
2a380 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2a390 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
2a3a0 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c    return pPg->fl
2a3b0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b  ags&PGHDR_DIRTY;
2a3c0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2a3d0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
2a3e0 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
2a3f0 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
2a400 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
2a410 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
2a420 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
2a430 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f  page pPg back to
2a440 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
2a450 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
2a460 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
2a470 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 54  ked as dirty.  T
2a480 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
2a490 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a   example, when.*
2a4a0 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  * the page has b
2a4b0 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c  een added as a l
2a4c0 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c  eaf of the freel
2a4d0 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a  ist and so its.*
2a4e0 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e  * content no lon
2a4f0 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a  ger matters..**.
2a500 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
2a510 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
2a520 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
2a530 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
2a540 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
2a550 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
2a560 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67 65  unused. The page
2a570 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
2a580 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
2a590 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
2a5a0 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
2a5b0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
2a5c0 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
2a5d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
2a5e0 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  n quadruple the 
2a5f0 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a  speed of large .
2a600 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  ** DELETE operat
2a610 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ions..*/.void sq
2a620 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2a630 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
2a640 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2a650 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2a660 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67    if( (pPg->flag
2a670 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26  s&PGHDR_DIRTY) &
2a680 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  & pPager->nSavep
2a690 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50  oint==0 ){.    P
2a6a0 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54  AGERTRACE(("DONT
2a6b0 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
2a6c0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
2a6d0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
2a6e0 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41  er)));.    IOTRA
2a6f0 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64  CE(("CLEAN %p %d
2a700 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
2a710 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67  ->pgno)).    pPg
2a720 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
2a730 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66  _DONT_WRITE;.#if
2a740 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
2a750 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
2a760 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
2a770 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
2a780 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
2a790 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a7a0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
2a7b0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
2a7c0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2a7d0 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67  e file .** chang
2a7e0 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65  e-counter, store
2a7f0 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69  d as a 4-byte bi
2a800 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2a810 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a   starting at .**
2a820 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2a830 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
2a840 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2a850 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
2a860 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  g is zero, then 
2a870 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20  this is done by 
2a880 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
2a890 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2a8a0 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  on page 1, then 
2a8b0 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
2a8c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
2a8d0 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74   page data. In t
2a8e0 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c  his case the fil
2a8f0 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65  e will be update
2a900 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  d when the curre
2a910 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
2a920 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
2a930 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65  **.** The isDire
2a940 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20  ctMode flag may 
2a950 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  only be non-zero
2a960 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   if the library 
2a970 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20  was compiled.** 
2a980 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
2a990 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2a9a0 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ITE macro define
2a9b0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  d. In this case,
2a9c0 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20  .** if isDirect 
2a9d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2a9e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a9f0 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64  ile is updated d
2aa00 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72  irectly.** by wr
2aa10 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64  iting an updated
2aa20 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
2aa30 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20   1 using a call 
2aa40 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  to the .** sqlit
2aa50 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63  e3OsWrite() func
2aa60 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2aa70 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
2aa80 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
2aa90 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2aaa0 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20  isDirectMode){. 
2aab0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2aac0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61  _OK;..  /* Decla
2aad0 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  re and initializ
2aae0 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  e constant integ
2aaf0 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20 49  er 'isDirect'. I
2ab00 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69  f the.  ** atomi
2ab10 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2ab20 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
2ab30 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74  in this build, t
2ab40 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a  hen isDirect.  *
2ab50 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  * is initialized
2ab60 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
2ab70 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44 69  ssed as the isDi
2ab80 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74  rectMode paramet
2ab90 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  er.  ** to this 
2aba0 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  function. Otherw
2abb0 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79  ise, it is alway
2abc0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20  s set to zero.. 
2abd0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65   **.  ** The ide
2abe0 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  a is that if the
2abf0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2ac00 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f  timization is no
2ac10 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61  t.  ** enabled a
2ac20 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2ac30 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e  the compiler can
2ac40 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73 20   omit the tests 
2ac50 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63  of.  ** 'isDirec
2ac60 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c  t' below, as wel
2ac70 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65  l as the block e
2ac80 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20  nclosed in the. 
2ac90 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65 63   ** "if( isDirec
2aca0 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a  t )" condition..
2acb0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2acc0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2acd0 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65  C_WRITE.# define
2ace0 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20   DIRECT_MODE 0. 
2acf0 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63   assert( isDirec
2ad00 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e  tMode==0 );.  UN
2ad10 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
2ad20 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65  sDirectMode);.#e
2ad30 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52  lse.# define DIR
2ad40 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63  ECT_MODE isDirec
2ad50 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20  tMode.#endif..  
2ad60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ad70 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
2ad80 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21  ERVED );.  if( !
2ad90 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2ada0 75 6e 74 44 6f 6e 65 20 26 26 20 41 4c 57 41 59  untDone && ALWAY
2adb0 53 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  S(pPager->dbSize
2adc0 3e 30 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72  >0) ){.    PgHdr
2add0 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20   *pPgHdr;       
2ade0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
2adf0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
2ae00 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67  */.    u32 chang
2ae10 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  e_counter;      
2ae20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2ae30 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d  value of change-
2ae40 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f  counter field */
2ae50 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ..    assert( !p
2ae60 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2ae70 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2ae80 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ->fd) );..    /*
2ae90 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
2aea0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
2aeb0 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
2aec0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2aed0 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
2aee0 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  gHdr);.    asser
2aef0 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20  t( pPgHdr==0 || 
2af00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2af10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65  ..    /* If page
2af20 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64   one was fetched
2af30 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61   successfully, a
2af40 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
2af50 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f   is not.    ** o
2af60 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65  perating in dire
2af70 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61  ct-mode, make pa
2af80 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20 20  ge 1 writable.  
2af90 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20  When not in .   
2afa0 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   ** direct mode,
2afb0 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61 79   page 1 is alway
2afc0 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 20  s held in cache 
2afd0 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50 61  and hence the Pa
2afe0 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a 20  gerGet().    ** 
2aff0 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73 20  above is always 
2b000 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65 6e  successful - hen
2b010 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f 6e  ce the ALWAYS on
2b020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a   rc==SQLITE_OK..
2b030 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
2b040 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20 41  DIRECT_MODE && A
2b050 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54 45  LWAYS(rc==SQLITE
2b060 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  _OK) ){.      rc
2b070 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b080 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
2b090 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
2b0a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b0b0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
2b0c0 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
2b0d0 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
2b0e0 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
2b0f0 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e  4. */.      chan
2b100 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
2b110 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
2b120 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
2b130 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61  Vers);.      cha
2b140 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
2b150 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
2b160 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
2b170 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
2b180 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  _counter);..    
2b190 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20    /* If running 
2b1a0 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20  in direct mode, 
2b1b0 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  write the conten
2b1c0 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  ts of page 1 to 
2b1d0 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  the file. */.   
2b1e0 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d 4f     if( DIRECT_MO
2b1f0 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  DE ){.        co
2b200 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d  nst void *zBuf =
2b210 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a   pPgHdr->pData;.
2b220 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2b230 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2b240 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ze>0 );.        
2b250 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2b260 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
2b270 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
2b280 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
2b290 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b2a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b2b0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
2b2c0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
2b2d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2b2f0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
2b300 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ntDone = 1;.    
2b310 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
2b320 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
2b330 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
2b340 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2b350 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
2b360 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
2b380 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f  he pager file to
2b390 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61   disk. This is a
2b3a0 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65   no-op for in-me
2b3b0 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72  mory files.** or
2b3c0 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20   pages with the 
2b3d0 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61  Pager.noSync fla
2b3e0 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  g set..**.** If 
2b3f0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 63  successful, or c
2b400 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72  alled on a pager
2b410 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 73   for which it is
2b420 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a   a no-op, this.*
2b430 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
2b440 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  ns SQLITE_OK. Ot
2b450 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65  herwise, an IO e
2b460 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2b470 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
2b480 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50  lite3PagerSync(P
2b490 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2b4a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2b4d0 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
2b4e0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
2b4f0 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
2b500 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2b510 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2b520 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2b530 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
2b540 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
2b550 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72  _flags);.  }.  r
2b560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b570 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
2b580 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
2b590 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
2b5a0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
2b5b0 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
2b5c0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2b5d0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
2b5e0 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
2b5f0 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
2b600 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
2b610 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
2b620 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
2b630 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
2b640 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
2b650 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
2b660 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
2b670 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
2b680 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
2b690 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
2b6a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2b6b0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
2b6c0 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  r is updated,.**
2b6d0 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c     * the journal
2b6e0 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65   is synced (unle
2b6f0 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ss the atomic-wr
2b700 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2b710 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20   is used),.**   
2b720 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  * all dirty page
2b730 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f  s are written to
2b740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b750 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20  le, .**   * the 
2b760 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2b770 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72   truncated (if r
2b780 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a  equired), and.**
2b790 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
2b7a0 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a  e file synced. .
2b7b0 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74  **.** The only t
2b7c0 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e  hing that remain
2b7d0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
2b7e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
2b7f0 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28  o finalize .** (
2b800 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65  delete, truncate
2b810 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72   or zero the fir
2b820 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20  st part of) the 
2b830 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
2b840 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
2b850 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2b860 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
2b870 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
2b880 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
2b890 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
2b8a0 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
2b8b0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
2b8c0 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
2b8d0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
2b8e0 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
2b8f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
2b900 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20  nal parameter - 
2b910 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65  noSync - is true
2b920 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
2b930 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a  ase file itself.
2b940 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64  ** is not synced
2b950 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
2b960 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  t call sqlite3Pa
2b970 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74  gerSync() direct
2b980 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68  ly to.** sync th
2b990 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b9a0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43  before calling C
2b9b0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
2b9c0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  to delete the.**
2b9d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
2b9e0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69   this case..*/.i
2b9f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
2ba00 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20  ommitPhaseOne(. 
2ba10 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
2ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba30 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2ba40 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2ba50 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20   *zMaster,      
2ba60 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
2ba70 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72  NULL, the master
2ba80 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
2ba90 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20  .  int noSync   
2baa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bab0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d     /* True to om
2bac0 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20  it the xSync on 
2bad0 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29  the db file */.)
2bae0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2baf0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2bb00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2bb10 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  de */..  /* The 
2bb20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 6e 65  dbOrigSize is ne
2bb30 76 65 72 20 73 65 74 20 69 66 20 6a 6f 75 72 6e  ver set if journ
2bb40 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a 20  al_mode=OFF */. 
2bb50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2bb60 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
2bb70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2bb80 4f 46 46 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  OFF || pPager->d
2bb90 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a  bOrigSize==0 );.
2bba0 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72  .  /* If a prior
2bbb0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
2bbc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   this routine sh
2bbd0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
2bbe0 65 64 2e 20 20 52 4f 4c 4c 42 41 43 4b 0a 20 20  ed.  ROLLBACK.  
2bbf0 2a 2a 20 69 73 20 74 68 65 20 61 70 70 72 6f 70  ** is the approp
2bc00 72 69 61 74 65 20 72 65 73 70 6f 6e 73 65 20 74  riate response t
2bc10 6f 20 61 6e 20 65 72 72 6f 72 2c 20 6e 6f 74 20  o an error, not 
2bc20 43 4f 4d 4d 49 54 2e 20 20 47 75 61 72 64 20 61  COMMIT.  Guard a
2bc30 67 61 69 6e 73 74 0a 20 20 2a 2a 20 63 6f 64 69  gainst.  ** codi
2bc40 6e 67 20 65 72 72 6f 72 73 20 62 79 20 72 65 70  ng errors by rep
2bc50 65 61 74 69 6e 67 20 74 68 65 20 70 72 69 6f 72  eating the prior
2bc60 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 69 66 28   error. */.  if(
2bc70 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
2bc80 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
2bc90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2bca0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
2bcb0 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
2bcc0 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
2bcd0 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c  =%s nSize=%d\n",
2bce0 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
2bcf0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74  zFilename, zMast
2bd00 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  er, pPager->dbSi
2bd10 7a 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  ze));..  if( MEM
2bd20 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
2bd30 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20  Modified ){.    
2bd40 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2bd50 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
2bd60 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
2bd70 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
2bd80 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   or this.    ** 
2bd90 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
2bda0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2bdb0 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61  , it is mostly a
2bdc0 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72   no-op.  However
2bdd0 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63  , any.    ** bac
2bde0 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20  kup in progress 
2bdf0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
2be00 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  arted..    */.  
2be10 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
2be20 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
2be30 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65  Backup);.  }else
2be40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
2be50 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
2be60 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f   && pPager->dbMo
2be70 64 69 66 69 65 64 20 29 7b 0a 0a 20 20 20 20 2f  dified ){..    /
2be80 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2be90 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68  block updates th
2bea0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2beb0 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74  . Exactly how it
2bec0 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69  .    ** does thi
2bed0 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  s depends on whe
2bee0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
2bef0 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70  atomic-update op
2bf00 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
2bf10 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74  * was enabled at
2bf20 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61   compile time, a
2bf30 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e 73  nd if this trans
2bf40 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65  action meets the
2bf50 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65   .    ** runtime
2bf60 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65   criteria to use
2bf70 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20   the operation: 
2bf80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2bf90 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73    * The file-sys
2bfa0 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
2bfb0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
2bfc0 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
2bfd0 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
2bfe0 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
2bff0 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20 20 20   and .    **    
2c000 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73  * This commit is
2c010 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d   not part of a m
2c020 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61  ulti-file transa
2c030 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a  ction, and.    *
2c040 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f  *    * Exactly o
2c050 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  ne page has been
2c060 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74   modified and st
2c070 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ore in the journ
2c080 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
2c090 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70      ** If the op
2c0a0 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e  timization was n
2c0b0 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ot enabled at co
2c0c0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e  mpile time, then
2c0d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
2c0e0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2c0f0 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  nter() function 
2c100 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64  is called to upd
2c110 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20  ate the change. 
2c120 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e     ** counter in
2c130 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27   'indirect-mode'
2c140 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  . If the optimiz
2c150 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65  ation is compile
2c160 64 20 69 6e 20 62 75 74 0a 20 20 20 20 2a 2a 20  d in but.    ** 
2c170 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c  is not applicabl
2c180 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61  e to this transa
2c190 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69  ction, call sqli
2c1a0 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
2c1b0 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  ().    ** to mak
2c1c0 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e  e sure the journ
2c1d0 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75  al file has actu
2c1e0 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65  ally been create
2c1f0 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20  d, then call.   
2c200 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   ** pager_incr_c
2c210 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
2c220 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
2c230 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69  nge-counter in i
2c240 6e 64 69 72 65 63 74 0a 20 20 20 20 2a 2a 20 6d  ndirect.    ** m
2c250 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ode. .    **.   
2c260 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
2c270 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2c280 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c  on is both enabl
2c290 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c  ed and applicabl
2c2a0 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 63  e,.    ** then c
2c2b0 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  all pager_incr_c
2c2c0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
2c2d0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
2c2e0 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20  nge-counter.    
2c2f0 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d  ** in 'direct' m
2c300 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
2c310 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2c320 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  le will never be
2c330 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
2c340 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
2c350 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  tion..    */.#if
2c360 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2c370 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2c380 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
2c390 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
2c3a0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
2c3b0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
2c3c0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2c3d0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
2c3e0 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
2c3f0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2c400 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26 26  r->jfd) .     &&
2c410 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2c420 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
2c430 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20 20  ize(pPager) .   
2c440 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53    && pPager->dbS
2c450 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize>=pPager->dbF
2c460 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 26 26 20  ileSize.     && 
2c470 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69 74  (0==(pPg = sqlit
2c480 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
2c490 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2c4a0 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70  e)) || 0==pPg->p
2c4b0 44 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20 20  Dirty).    ){.  
2c4c0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2c4d0 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
2c4e0 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65   counter via the
2c4f0 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65   direct-write me
2c500 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20  thod. The .     
2c510 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61   ** following ca
2c520 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74  ll will modify t
2c530 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
2c540 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
2c550 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20  age 1 .      ** 
2c560 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
2c570 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f  pdated change co
2c580 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77  unter and then w
2c590 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20  rite page 1 .   
2c5a0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
2c5b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2c5c0 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ile. Because of 
2c5d0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2c5e0 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65   .      ** prope
2c5f0 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20  rty of the host 
2c600 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69  file-system, thi
2c610 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
2c620 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
2c630 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2c640 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
2c650 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
2c660 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c670 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70  3JournalCreate(p
2c680 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
2c690 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c6a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c6b0 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
2c6c0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
2c6d0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
2c6e0 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  }.    }.#else.  
2c6f0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
2c700 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2c710 70 50 61 67 65 72 2c 20 30 29 3b 0a 23 65 6e 64  pPager, 0);.#end
2c720 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  if.    if( rc!=S
2c730 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2c740 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2c750 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  _exit;..    /* I
2c760 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
2c770 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
2c780 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
2c790 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
2c7a0 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69  .    ** being di
2c7b0 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
2c7c0 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
2c7d0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
2c7e0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
2c7f0 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  file. This can o
2c800 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75  nly happen in au
2c810 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a  to-vacuum mode..
2c820 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 65      **.    ** Be
2c830 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68 65  fore reading the
2c840 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
2c850 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72 20   numbers larger 
2c860 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  than the .    **
2c870 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
2c880 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
2c890 73 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20  set dbSize back 
2c8a0 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  to the value.   
2c8b0 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b   ** that it took
2c8c0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2c8d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2c8e0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
2c8f0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
2c900 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
2c910 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64  () return zeroed
2c920 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f   pages instead o
2c930 66 20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  f .    ** readin
2c940 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  g data from the 
2c950 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2c960 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68 65     **.    ** Whe
2c970 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d  n journal_mode==
2c980 4f 46 46 20 74 68 65 20 64 62 4f 72 69 67 53 69  OFF the dbOrigSi
2c990 7a 65 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72  ze is always zer
2c9a0 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20 20 20 2a  o, so this.    *
2c9b0 2a 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75  * block never ru
2c9c0 6e 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ns if journal_mo
2c9d0 64 65 3d 4f 46 46 2e 0a 20 20 20 20 2a 2f 0a 23  de=OFF..    */.#
2c9e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c9f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2ca00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
2ca10 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f  Size<pPager->dbO
2ca20 72 69 67 53 69 7a 65 20 0a 20 20 20 20 20 26 26  rigSize .     &&
2ca30 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e   ALWAYS(pPager->
2ca40 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2ca50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2ca60 46 46 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  FF).    ){.     
2ca70 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20   Pgno i;        
2ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2caa0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
2cab0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50  */.      const P
2cac0 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45  gno iSkip = PAGE
2cad0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
2cae0 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f  ); /* Pending lo
2caf0 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ck page */.     
2cb00 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69   const Pgno dbSi
2cb10 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
2cb20 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  ize;       /* Da
2cb30 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a  tabase image siz
2cb40 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61 67  e */ .      pPag
2cb50 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
2cb60 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
2cb70 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62  .      for( i=db
2cb80 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65  Size+1; i<=pPage
2cb90 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69  r->dbOrigSize; i
2cba0 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ++ ){.        if
2cbb0 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  ( !sqlite3Bitvec
2cbc0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
2cbd0 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69  Journal, i) && i
2cbe0 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
2cbf0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
2cc00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2cc10 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61  * Page to journa
2cc20 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  l */.          r
2cc30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2cc40 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
2cc50 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2cc60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cc70 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2cc80 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2cc90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2cca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2ccb0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
2ccc0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2ccd0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
2cce0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2ccf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2cd00 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2cd10 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
2cd20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20   }.      } .    
2cd30 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
2cd40 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d   = dbSize;.    }
2cd50 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2cd60 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
2cd70 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
2cd80 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2cd90 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72  ile. If a master
2cda0 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   .    ** journal
2cdb0 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
2cdc0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
2cdd0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2cde0 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a 2a  al file, .    **
2cdf0 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69   or if zMaster i
2ce00 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65  s NULL (no maste
2ce10 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e  r journal), then
2ce20 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
2ce30 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
2ce40 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
2ce50 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
2ce60 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
2ce70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ce80 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2ce90 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2cea0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
2ceb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
2cec0 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  f the atomic-upd
2ced0 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
2cee0 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a   is being.    **
2cef0 20 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c   used, this call
2cf00 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65   will not create
2cf10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cf20 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79  e or perform any
2cf30 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e  .    ** real IO.
2cf40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2cf50 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
2cf60 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
2cf70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2cf80 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2cf90 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  one_exit;..    /
2cfa0 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
2cfb0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
2cfc0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2cfd0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2cfe0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73  write_pagelist(s
2cff0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2d000 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2d010 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66 28  Cache));.    if(
2d020 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d030 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2d040 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
2d050 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  _BLOCKED );.    
2d060 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68    goto commit_ph
2d070 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2d080 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
2d090 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
2d0a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2d0b0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2d0c0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e  ile on disk is n
2d0d0 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  ot the same size
2d0e0 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
2d0f0 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20 74   image,.    ** t
2d100 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72  hen use pager_tr
2d110 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f  uncate to grow o
2d120 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c  r shrink the fil
2d130 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  e here..    */. 
2d140 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
2d150 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64  bSize!=pPager->d
2d160 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
2d170 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70     Pgno nNew = p
2d180 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20  Pager->dbSize - 
2d190 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d  (pPager->dbSize=
2d1a0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
2d1b0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 61  Pager));.      a
2d1c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2d1d0 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
2d1e0 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72  USIVE );.      r
2d1f0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
2d200 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29  te(pPager, nNew)
2d210 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2d220 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2d230 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2d240 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20  e_exit;.    }.. 
2d250 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73     /* Finally, s
2d260 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
2d270 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
2d280 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
2d290 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a  c && !noSync ){.
2d2a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d2b0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2d2c0 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
2d2d0 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
2d2e0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
2d2f0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
2d300 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
2d310 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2d320 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d  SYNCED;.  }..com
2d330 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2d340 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
2d350 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  .}.../*.** When 
2d360 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2d370 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74   called, the dat
2d380 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62  abase file has b
2d390 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a  een completely.*
2d3a0 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66  * updated to ref
2d3b0 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73  lect the changes
2d3c0 20 6d 61 64 65 20 62 79 20 74 68 65 20 63 75 72   made by the cur
2d3d0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
2d3e0 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74   and.** synced t
2d3f0 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72  o disk. The jour
2d400 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65  nal file still e
2d410 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
2d420 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f  e-system .** tho
2d430 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61  ugh, and if a fa
2d440 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74 20  ilure occurs at 
2d450 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69  this point it wi
2d460 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  ll eventually.**
2d470 20 62 65 20 75 73 65 64 20 61 73 20 61 20 68 6f   be used as a ho
2d480 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t-journal and th
2d490 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
2d4a0 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63  ction rolled bac
2d4b0 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  k..**.** This fu
2d4c0 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73  nction finalizes
2d4d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d4e0 65 2c 20 65 69 74 68 65 72 20 62 79 20 64 65 6c  e, either by del
2d4f0 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63  eting, .** trunc
2d500 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c  ating or partial
2d510 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73  ly zeroing it, s
2d520 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74  o that it cannot
2d530 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72   be used .** for
2d540 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2d550 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73  lback. Once this
2d560 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61   is done the tra
2d570 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69  nsaction is.** i
2d580 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69  rrevocably commi
2d590 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
2d5a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d5b0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2d5c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2d5d0 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f   the pager.** mo
2d5e0 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ves into the err
2d5f0 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  or state. Otherw
2d600 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
2d610 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
2d620 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
2d630 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61  ommitPhaseTwo(Pa
2d640 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2d650 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d660 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2d670 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2d680 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
2d690 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
2d6a0 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69   not be called i
2d6b0 66 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20  f a prior error 
2d6c0 68 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  has occurred..  
2d6d0 2a 2a 20 42 75 74 20 69 66 20 28 64 75 65 20 74  ** But if (due t
2d6e0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
2d6f0 20 65 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68   elsewhere in th
2d700 65 20 73 79 73 74 65 6d 29 20 69 74 20 64 6f 65  e system) it doe
2d710 73 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65  s get.  ** calle
2d720 64 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  d, just return t
2d730 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f  he same error co
2d740 64 65 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  de without doing
2d750 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20   anything. */.  
2d760 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2d770 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
2d780 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
2d790 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  ode;..  /* This 
2d7a0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2d7b0 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66  not be called if
2d7c0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
2d7d0 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20  t in at least.  
2d7e0 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
2d7f0 44 20 73 74 61 74 65 2e 20 41 6e 64 20 69 6e 64  D state. And ind
2d800 65 65 64 20 53 51 4c 69 74 65 20 6e 65 76 65 72  eed SQLite never
2d810 20 64 6f 65 73 20 74 68 69 73 2e 20 42 75 74 20   does this. But 
2d820 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20  it is.  ** nice 
2d830 74 6f 20 68 61 76 65 20 74 68 69 73 20 64 65 66  to have this def
2d840 65 6e 73 69 76 65 20 74 65 73 74 20 68 65 72 65  ensive test here
2d850 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20   anyway..  */.  
2d860 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2d870 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
2d880 53 45 52 56 45 44 29 20 29 20 72 65 74 75 72 6e  SERVED) ) return
2d890 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
2d8a0 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61    /* An optimiza
2d8b0 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74  tion. If the dat
2d8c0 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63  abase was not ac
2d8d0 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20  tually modified 
2d8e0 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73  during.  ** this
2d8f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2d900 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
2d910 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
2d920 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a  mode and is.  **
2d930 20 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e   using persisten
2d940 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
2d950 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2d960 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
2d970 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f    ** The start o
2d980 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2d990 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
2d9a0 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a  tains a single j
2d9b0 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61  ournal .  ** hea
2d9c0 64 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65  der with the nRe
2d9d0 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30  c field set to 0
2d9e0 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72  . If such a jour
2d9f0 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20  nal is used as. 
2da00 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
2da10 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  l during hot-jou
2da20 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30  rnal rollback, 0
2da30 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65   changes will be
2da40 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68   made.  ** to th
2da50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2da60 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   So there is no 
2da70 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65  need to zero the
2da80 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68   journal .  ** h
2da90 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65  eader. Since the
2daa0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
2dab0 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
2dac0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
2dad0 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c  ** to drop any l
2dae0 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a  ocks either..  *
2daf0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
2db00 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26  dbModified==0 &&
2db10 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2db20 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50  veMode .   && pP
2db30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2db40 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2db50 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29  MODE_PERSIST.  )
2db60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2db70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2db80 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
2db90 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2dba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2dbb0 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2dbc0 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE(("COMMIT %d\
2dbd0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2dbe0 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  er)));.  assert(
2dbf0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
2dc00 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
2dc10 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72  MEMDB || !pPager
2dc20 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a  ->dbModified );.
2dc30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
2dc40 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2dc50 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2dc60 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
2dc70 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2dc80 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
2dc90 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
2dca0 20 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64 61   changes. The da
2dcb0 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
2dcc0 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
2dcd0 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  D mode..**.** Th
2dce0 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66  is function perf
2dcf0 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a  orms two tasks:.
2dd00 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f  **.**   1) It ro
2dd10 6c 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75  lls back the jou
2dd20 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f  rnal file, resto
2dd30 72 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73  ring all databas
2dd40 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20  e file and .**  
2dd50 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61      in-memory ca
2dd60 63 68 65 20 70 61 67 65 73 20 74 6f 20 74 68 65  che pages to the
2dd70 20 73 74 61 74 65 20 74 68 65 79 20 77 65 72 65   state they were
2dd80 20 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61   in when the tra
2dd90 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2dda0 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64   was opened, and
2ddb0 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e 61  .**   2) It fina
2ddc0 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
2ddd0 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 20  l file, so that 
2dde0 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66  it is not used f
2ddf0 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72  or hot.**      r
2de00 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20 70  ollback at any p
2de10 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
2de20 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63  re..**.** subjec
2de30 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
2de40 6e 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e  ng qualification
2de50 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68  s:.**.** * If th
2de60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2de70 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20 77  s not yet open w
2de80 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2de90 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  n is called,.** 
2dea0 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20    then only (2) 
2deb0 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e  is performed. In
2dec0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2ded0 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66   is no journal f
2dee0 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c  ile.**   to roll
2def0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49   back..**.** * I
2df00 66 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  f in an error st
2df10 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ate other than S
2df20 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e  QLITE_FULL, then
2df30 20 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a   task (1) is .**
2df40 20 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 66     performed. If
2df50 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61 73   successful, tas
2df60 6b 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65 73  k (2). Regardles
2df70 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
2df80 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72 2c  .**   of either,
2df90 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2dfa0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2dfb0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
2dfc0 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e  aller.**   (i.e.
2dfd0 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49   either SQLITE_I
2dfe0 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 43  OERR or SQLITE_C
2dff0 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a  ORRUPT)..**.** *
2e000 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2e010 20 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52 56   in PAGER_RESERV
2e020 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61  ED state, then a
2e030 74 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65 74  ttempt (1). Whet
2e040 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20  her.**   or not 
2e050 28 31 29 20 69 73 20 73 75 63 63 75 73 73 66 75  (1) is succussfu
2e060 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74 20  l, also attempt 
2e070 28 32 29 2e 20 49 66 20 73 75 63 63 65 73 73 66  (2). If successf
2e080 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  ul, return.**   
2e090 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
2e0a0 77 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65 20  wise, enter the 
2e0b0 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
2e0c0 72 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74  return the first
2e0d0 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f 64   .**   error cod
2e0e0 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a  e encountered. .
2e0f0 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20  **.**   In this 
2e100 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
2e110 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
2e120 20 64 61 74 61 62 61 73 65 20 77 61 73 20 77 72   database was wr
2e130 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20  itten to. .**   
2e140 53 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66 69  So is safe to fi
2e150 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
2e160 61 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66 20  al file even if 
2e170 74 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a  the playback .**
2e180 20 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29     (operation 1)
2e190 20 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65 72   failed. However
2e1a0 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   the pager must 
2e1b0 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
2e1c0 73 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74 68  state.**   as th
2e1d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2e1e0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
2e1f0 65 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65 63  e are now suspec
2e200 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c  t..**.** * Final
2e210 6c 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52 5f  ly, if in PAGER_
2e220 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
2e230 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31   then attempt (1
2e240 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74  ). Only.**   att
2e250 65 6d 70 74 20 28 32 29 20 69 66 20 28 31 29 20  empt (2) if (1) 
2e260 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 52  is successful. R
2e270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2e280 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  if successful,.*
2e290 2a 20 20 20 6f 74 68 65 72 77 69 73 65 20 65 6e  *   otherwise en
2e2a0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
2e2b0 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
2e2c0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  he error code fr
2e2d0 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61 69  om the .**   fai
2e2e0 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  ling operation..
2e2f0 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20  **.**   In this 
2e300 63 61 73 65 20 74 68 65 20 64 61 74 61 62 61 73  case the databas
2e310 65 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20  e file may have 
2e320 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e  been written to.
2e330 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20 20   So if the.**   
2e340 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69  playback operati
2e350 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63 65  on did not succe
2e360 65 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20  ed it would not 
2e370 62 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c  be safe to final
2e380 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75  ize.**   the jou
2e390 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65  rnal file. It ne
2e3a0 65 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20 69  eds to be left i
2e3b0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2e3c0 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73  m so that.**   s
2e3d0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
2e3e0 73 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f 20  s can use it to 
2e3f0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
2e400 62 61 73 65 20 73 74 61 74 65 20 28 62 79 0a 2a  base state (by.*
2e410 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  *   hot-journal 
2e420 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e  rollback)..*/.in
2e430 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  t sqlite3PagerRo
2e440 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
2e450 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2e460 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e480 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2e490 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 52    PAGERTRACE(("R
2e4a0 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
2e4b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
2e4c0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
2e4d0 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21  >dbModified || !
2e4e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2e4f0 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  fd) ){.    rc = 
2e500 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
2e510 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
2e520 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
2e530 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
2e540 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
2e550 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2e560 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
2e570 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2e580 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
2e590 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
2e5a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2e5b0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2e5c0 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  }.    rc = pPage
2e5d0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
2e5e0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
2e5f0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
2e600 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
2e610 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
2e620 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
2e630 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
2e640 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70  );.      rc2 = p
2e650 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2e660 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2e670 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2e680 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2e690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e6a0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
2e6b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2e6c0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2e6d0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
2e6e0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  r, 0);.    }..  
2e6f0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
2e700 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2e710 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
2e720 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2e730 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2e740 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
2e750 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
2e760 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
2e770 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  ger.    ** cache
2e780 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
2e790 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
2e7a0 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
2e7b0 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a  ny error .    **
2e7c0 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20   persistent..   
2e7d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
2e7e0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2e7f0 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
2e800 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e810 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2e820 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e830 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
2e840 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
2e850 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
2e860 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
2e870 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
2e880 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67  */.u8 sqlite3Pag
2e890 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
2e8a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2e8b0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
2e8c0 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
2e8d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
2e8e0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2e8f0 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
2e900 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2e910 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
2e920 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2e930 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
2e940 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2e950 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
2e960 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2e970 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
2e980 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63  nces to the spec
2e990 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69  ified page..*/.i
2e9a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
2e9b0 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61  ageRefcount(DbPa
2e9c0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  ge *pPage){.  re
2e9d0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
2e9e0 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
2e9f0 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  Page);.}..#ifdef
2ea00 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
2ea10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ea20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
2ea30 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
2ea40 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
2ea50 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
2ea60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2ea70 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
2ea80 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71  11];.  a[0] = sq
2ea90 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
2eaa0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
2eab0 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73  che);.  a[1] = s
2eac0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
2ead0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
2eae0 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d  Cache);.  a[2] =
2eaf0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65   sqlite3PcacheGe
2eb00 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
2eb10 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
2eb20 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
2eb30 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74  SizeValid ? (int
2eb40 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ) pPager->dbSize
2eb50 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20   : -1;.  a[4] = 
2eb60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
2eb70 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
2eb80 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
2eb90 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
2eba0 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
2ebb0 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
2ebc0 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
2ebd0 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c  be pPager->nOvfl
2ebe0 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61   */.  a[9] = pPa
2ebf0 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
2ec00 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
2ec10 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
2ec20 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2ec30 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2ec40 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2ec50 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a  emory pager..*/.
2ec60 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2ec70 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70  IsMemdb(Pager *p
2ec80 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2ec90 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   MEMDB;.}../*.**
2eca0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   Check that ther
2ecb0 65 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e  e are at least n
2ecc0 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f  Savepoint savepo
2ecd0 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74 68  ints open. If th
2ece0 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  ere are.** curre
2ecf0 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 6e  ntly less than n
2ed00 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c  Savepoints open,
2ed10 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f   then open one o
2ed20 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
2ed30 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20  s.** to make up 
2ed40 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e 20  the difference. 
2ed50 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
2ed60 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20 61   savepoints is a
2ed70 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20  lready.** equal 
2ed80 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74  to nSavepoint, t
2ed90 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2eda0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2edb0 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
2edc0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2edd0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
2ede0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2edf0 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
2ee00 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
2ee10 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2ee20 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49   file, then an I
2ee30 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a  O error code is.
2ee40 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  ** returned. Oth
2ee50 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
2ee60 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
2ee70 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
2ee80 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
2ee90 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  r, int nSavepoin
2eea0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2eeb0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eed0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2eee0 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74  /.  int nCurrent
2eef0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   = pPager->nSave
2ef00 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  point;        /*
2ef10 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   Current number 
2ef20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  of savepoints */
2ef30 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69  ..  if( nSavepoi
2ef40 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20 70  nt>nCurrent && p
2ef50 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2ef60 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  l ){.    int ii;
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef90 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
2efa0 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67  iable */.    Pag
2efb0 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65  erSavepoint *aNe
2efc0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2efd0 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67 65       /* New Page
2efe0 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72  r.aSavepoint arr
2eff0 61 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 69  ay */..    /* Ei
2f000 74 68 65 72 20 74 68 65 72 65 20 69 73 20 6e 6f  ther there is no
2f010 20 61 63 74 69 76 65 20 6a 6f 75 72 6e 61 6c 20   active journal 
2f020 6f 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  or the sub-journ
2f030 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 0a 20  al is open or . 
2f040 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
2f050 6c 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72  l is always stor
2f060 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ed in memory */.
2f070 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2f080 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
2f090 30 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  0 || isOpen(pPag
2f0a0 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 0a 20 20 20  er->sjfd) ||.   
2f0b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2f0c0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2f0d0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2f0e0 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f  MEMORY );..    /
2f0f0 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72  * Grow the Pager
2f100 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
2f110 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28  y using realloc(
2f120 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
2f130 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66  _NOMEM.    ** if
2f140 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
2f150 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65  fails. Otherwise
2f160 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70  , zero the new p
2f170 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61  ortion in case a
2f180 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20   .    ** malloc 
2f190 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
2f1a0 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
2f1b0 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e  it in the for(..
2f1c0 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20  .) loop below.. 
2f1d0 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d     */.    aNew =
2f1e0 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74   (PagerSavepoint
2f1f0 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   *)sqlite3Reallo
2f200 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  c(.        pPage
2f210 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73  r->aSavepoint, s
2f220 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
2f230 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74  oint)*nSavepoint
2f240 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
2f250 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !aNew ){.      r
2f260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2f270 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
2f280 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72  mset(&aNew[nCurr
2f290 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70  ent], 0, (nSavep
2f2a0 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a  oint-nCurrent) *
2f2b0 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
2f2c0 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50  epoint));.    pP
2f2d0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2f2e0 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50 61   = aNew;.    pPa
2f2f0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2f300 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20  = nSavepoint;.. 
2f310 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
2f320 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
2f330 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73  t structures jus
2f340 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a  t allocated. */.
2f350 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72      for(ii=nCurr
2f360 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69  ent; ii<nSavepoi
2f370 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
2f380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f390 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
2f3a0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e        aNew[ii].n
2f3b0 4f 72 69 67 20 3d 20 70 50 61 67 65 72 2d 3e 64  Orig = pPager->d
2f3c0 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  bSize;.      if(
2f3d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2f3e0 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
2f3f0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a  journalOff>0 ){.
2f400 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
2f410 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  .iOffset = pPage
2f420 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
2f430 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f440 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66      aNew[ii].iOf
2f450 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  fset = JOURNAL_H
2f460 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
2f470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65       }.      aNe
2f480 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20  w[ii].iSubRec = 
2f490 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
2f4a0 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
2f4b0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73  pInSavepoint = s
2f4c0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
2f4d0 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
2f4e0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61  e);.      if( !a
2f4f0 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
2f500 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  oint ){.        
2f510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f520 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
2f530 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   }..    /* Open 
2f540 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
2f550 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
2f560 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f  ready opened. */
2f570 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
2f580 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
2f590 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2f5a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2f5b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2f5c0 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
2f5d0 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d   or release (com
2f5e0 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74  mit) a savepoint
2f5f0 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69  ..** The savepoi
2f600 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72  nt to release or
2f610 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e   rollback need n
2f620 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72  ot be the most r
2f630 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61  ecently .** crea
2f640 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ted savepoint..*
2f650 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f  *.** Parameter o
2f660 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  p is always eith
2f670 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
2f680 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49  LBACK or SAVEPOI
2f690 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49  NT_RELEASE..** I
2f6a0 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
2f6b0 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
2f6c0 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74  release and dest
2f6d0 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
2f6e0 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  t with.** index 
2f6f0 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69  iSavepoint. If i
2f700 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
2f710 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f  OLLBACK, then ro
2f720 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
2f730 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  es.** that have 
2f740 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74  occurred since t
2f750 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76  he specified sav
2f760 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74  epoint was creat
2f770 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  ed..**.** The sa
2f780 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62  vepoint to rollb
2f790 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69  ack or release i
2f7a0 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
2f7b0 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53  parameter .** iS
2f7c0 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75  avepoint. A valu
2f7d0 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20  e of 0 means to 
2f7e0 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f  operate on the o
2f7f0 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69  utermost savepoi
2f800 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74  nt.** (the first
2f810 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c   created). A val
2f820 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61  ue of (Pager.nSa
2f830 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73  vepoint-1) means
2f840 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74   operate.** on t
2f850 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
2f860 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69   created savepoi
2f870 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e  nt. If iSavepoin
2f880 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
2f890 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76  n.** (Pager.nSav
2f8a0 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20  epoint-1), then 
2f8b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2f8c0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2f8d0 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  If a negative va
2f8e0 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  lue is passed to
2f8f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2f900 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
2f910 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2f920 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
2f930 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
2f940 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  t to calling .**
2f950 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
2f960 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20  lback() because 
2f970 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
2f980 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  es not terminate
2f990 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
2f9a0 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ion or unlock th
2f9b0 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a  e database, it j
2f9c0 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65  ust restores the
2f9d0 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
2f9e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
2f9f0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
2fa00 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  ate. .**.** In a
2fa10 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76  ny case, all sav
2fa20 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20  epoints with an 
2fa30 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
2fa40 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a  an iSavepoint .*
2fa50 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e  * are destroyed.
2fa60 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65   If this is a re
2fa70 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20  lease operation 
2fa80 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  (op==SAVEPOINT_R
2fa90 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e  ELEASE),.** then
2faa0 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65   savepoint iSave
2fab0 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65  point is also de
2fac0 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  stroyed..**.** T
2fad0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
2fae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2faf0 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79  OMEM if a memory
2fb00 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
2fb10 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65  s,.** or an IO e
2fb20 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
2fb30 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2fb40 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61  while rolling ba
2fb50 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69  ck a .** savepoi
2fb60 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73  nt. If no errors
2fb70 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
2fb80 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
2fb90 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  / .int sqlite3Pa
2fba0 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67  gerSavepoint(Pag
2fbb0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2fbc0 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
2fbd0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
2fbe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2fbf0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
2fc00 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
2fc10 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
2fc20 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  LBACK );.  asser
2fc30 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
2fc40 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
2fc50 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20  T_ROLLBACK );.. 
2fc60 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
2fc70 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2fc80 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  nt ){.    int ii
2fc90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2fca0 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2fcb0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65  e */.    int nNe
2fcc0 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  w;          /* N
2fcd0 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69  umber of remaini
2fce0 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66  ng savepoints af
2fcf0 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a  ter this op. */.
2fd00 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
2fd10 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65  ut how many save
2fd20 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c  points will stil
2fd30 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65  l be active afte
2fd40 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70  r this.    ** op
2fd50 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74  eration. Store t
2fd60 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65  his value in nNe
2fd70 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73  w. Then free res
2fd80 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65  ources associate
2fd90 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  d .    ** with a
2fda0 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68  ny savepoints th
2fdb0 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  at are destroyed
2fdc0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
2fdd0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  on..    */.    n
2fde0 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  New = iSavepoint
2fdf0 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   + (op==SAVEPOIN
2fe00 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
2fe10 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69   for(ii=nNew; ii
2fe20 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
2fe30 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
2fe40 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
2fe50 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
2fe60 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
2fe70 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  nSavepoint);.   
2fe80 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
2fe90 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77  Savepoint = nNew
2fea0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2feb0 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
2fec0 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62  operation, playb
2fed0 61 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65  ack the specifie
2fee0 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20  d savepoint..   
2fef0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
2ff00 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69   temp-file, it i
2ff10 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
2ff20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2ff30 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   has.    ** not 
2ff40 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
2ff50 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2ff60 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
2ff70 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20   changes to.    
2ff80 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2ff90 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61  file, so the pla
2ffa0 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
2ffb0 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
2ffc0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
2ffd0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
2ffe0 4c 42 41 43 4b 20 26 26 20 69 73 4f 70 65 6e 28  LBACK && isOpen(
2fff0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
30000 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70        PagerSavep
30010 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
30020 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26   = (nNew==0)?0:&
30030 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
30040 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20  nt[nNew-1];.    
30050 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79    rc = pagerPlay
30060 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50  backSavepoint(pP
30070 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74  ager, pSavepoint
30080 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
30090 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29  rc!=SQLITE_DONE)
300a0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
300b0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
300c0 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75  elease of the ou
300d0 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
300e0 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20  t, truncate .   
300f0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
30100 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  nal to zero byte
30110 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20  s in size. */.  
30120 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26    if( nNew==0 &&
30130 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
30140 45 4c 45 41 53 45 20 26 26 20 69 73 4f 70 65 6e  ELEASE && isOpen
30150 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
30160 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
30180 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
30190 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
301a0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a  ager->sjfd, 0);.
301b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53        pPager->nS
301c0 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 7d  ubRec = 0;.    }
301d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
301e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
301f0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
30200 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
30210 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
30220 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
30230 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
30240 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30250 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
30260 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
30270 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
30280 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
30290 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
302a0 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
302b0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
302c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
302d0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
302e0 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
302f0 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
30300 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
30310 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
30320 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
30330 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
30340 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e  s might return N
30350 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ULL if the file 
30360 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62  has.** not yet b
30370 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  een opened..*/.s
30380 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c  qlite3_file *sql
30390 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61  ite3PagerFile(Pa
303a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
303b0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
303c0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
303d0 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
303e0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
303f0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
30400 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
30410 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
30420 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30430 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
30440 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
30450 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
30460 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
30470 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
30480 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
30490 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
304a0 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
304b0 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
304c0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
304d0 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
304e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
304f0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
30500 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
30510 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
30520 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 72 65  ./*.** Set or re
30530 74 72 69 65 76 65 20 74 68 65 20 63 6f 64 65 63  trieve the codec
30540 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a   for this pager.
30550 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
30560 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 6f  qlite3PagerSetCo
30570 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50  dec(.  Pager *pP
30580 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a  ager,.  void *(*
30590 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
305a0 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
305b0 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69   void (*xCodecSi
305c0 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e  zeChng)(void*,in
305d0 74 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28  t,int),.  void (
305e0 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
305f0 64 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  d*),.  void *pCo
30600 64 65 63 0a 29 7b 0a 20 20 69 66 28 20 70 50 61  dec.){.  if( pPa
30610 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
30620 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ) pPager->xCodec
30630 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f  Free(pPager->pCo
30640 64 65 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dec);.  pPager->
30650 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
30660 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
30670 63 53 69 7a 65 43 68 6e 67 20 3d 20 78 43 6f 64  cSizeChng = xCod
30680 65 63 53 69 7a 65 43 68 6e 67 3b 0a 20 20 70 50  ecSizeChng;.  pP
30690 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
306a0 20 3d 20 78 43 6f 64 65 63 46 72 65 65 3b 0a 20   = xCodecFree;. 
306b0 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 20   pPager->pCodec 
306c0 3d 20 70 43 6f 64 65 63 3b 0a 20 20 70 61 67 65  = pCodec;.  page
306d0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
306e0 65 72 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  er);.}.static vo
306f0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
30700 47 65 74 43 6f 64 65 63 28 50 61 67 65 72 20 2a  GetCodec(Pager *
30710 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
30720 6e 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63  n pPager->pCodec
30730 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
30740 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30750 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
30760 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70   Move the page p
30770 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  Pg to location p
30780 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
30790 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
307a0 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
307b0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
307c0 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
307d0 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
307e0 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
307f0 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
30800 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
30810 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
30820 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
30830 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
30840 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f  ed at pgno is no
30850 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
30860 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
30870 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
30880 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79 20  put there by by 
30890 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
308a0 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74  .** References t
308b0 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20 72  o the page pPg r
308c0 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64  emain valid. Upd
308d0 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74  ating any.** met
308e0 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  a-data associate
308f0 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e  d with pPg (i.e.
30900 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
30910 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
30920 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
30930 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
30940 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
30950 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
30960 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
30970 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
30980 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
30990 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
309a0 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20  called. It used 
309b0 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65  to be.** require
309c0 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65  d that a stateme
309d0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
309e0 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62  as not active, b
309f0 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74  ut this restrict
30a00 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
30a10 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20  removed (CREATE 
30a20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d  INDEX needs to m
30a30 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20  ove a page when 
30a40 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  a statement.** t
30a50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
30a60 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tive)..**.** If 
30a70 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
30a80 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 69  ent, isCommit, i
30a90 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
30aa0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62 65   this page is be
30ab0 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73 20  ing.** moved as 
30ac0 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62 61  part of a databa
30ad0 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69 6f  se reorganizatio
30ae0 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  n just before th
30af0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
30b00 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  * is being commi
30b10 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  tted. In this ca
30b20 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e  se, it is guaran
30b30 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64 61  teed that the da
30b40 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a 20  tabase page .** 
30b50 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77 69  pPg refers to wi
30b60 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ll not be writte
30b70 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68 69  n to again withi
30b80 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
30b90 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  on..**.** This f
30ba0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
30bb0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  rn SQLITE_NOMEM 
30bc0 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
30bd0 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
30be0 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65 72  ** occurs. Other
30bf0 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e 73  wise, it returns
30c00 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
30c10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
30c20 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
30c30 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
30c40 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69  Pg, Pgno pgno, i
30c50 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20  nt isCommit){.  
30c60 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20  PgHdr *pPgOld;  
30c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30c80 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f  The page being o
30c90 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20  verwritten. */. 
30ca0 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
30cb0 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  no = 0;       /*
30cc0 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70 50   Old value of pP
30cd0 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e 63  g->pgno, if sync
30ce0 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   is required */.
30cf0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
30d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30d10 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
30d20 0a 20 20 50 67 6e 6f 20 6f 72 69 67 50 67 6e 6f  .  Pgno origPgno
30d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30d40 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
30d50 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a  page number */..
30d60 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
30d70 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  Ref>0 );..  /* I
30d80 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  f the page being
30d90 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74 79 20   moved is dirty 
30da0 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  and has not been
30db0 20 73 61 76 65 64 20 62 79 20 74 68 65 20 6c 61   saved by the la
30dc0 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f  test.  ** savepo
30dd0 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74  int, then save t
30de0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
30df0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
30e00 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73  into the .  ** s
30e10 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20  ub-journal now. 
30e20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
30e30 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66   to handle the f
30e40 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69  ollowing scenari
30e50 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42  o:.  **.  **   B
30e60 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c  EGIN;.  **     <
30e70 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20  journal page X, 
30e80 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69  then modify it i
30e90 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20  n memory>.  **  
30ea0 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65     SAVEPOINT one
30eb0 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f  ;.  **       <Mo
30ec0 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63  ve page X to loc
30ed0 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20  ation Y>.  **   
30ee0 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e    ROLLBACK TO on
30ef0 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e;.  **.  ** If 
30f00 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20  page X were not 
30f10 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
30f20 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c  ub-journal here,
30f30 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20   it would not.  
30f40 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ** be possible t
30f50 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f  o restore its co
30f60 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20  ntents when the 
30f70 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65  "ROLLBACK TO one
30f80 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ".  ** statement
30f90 20 77 65 72 65 20 69 73 20 70 72 6f 63 65 73 73   were is process
30fa0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75  ed..  **.  ** su
30fb0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d  bjournalPage() m
30fc0 61 79 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63  ay need to alloc
30fd0 61 74 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f  ate space to sto
30fe0 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74  re pPg->pgno int
30ff0 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f  o.  ** one or mo
31000 72 65 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74  re savepoint bit
31010 76 65 63 73 2e 20 54 68 69 73 20 69 73 20 74 68  vecs. This is th
31020 65 20 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75  e reason this fu
31030 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20  nction.  ** may 
31040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
31050 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  MEM..  */.  if( 
31060 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
31070 5f 44 49 52 54 59 20 0a 20 20 20 26 26 20 73 75  _DIRTY .   && su
31080 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
31090 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45  Pg).   && SQLITE
310a0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f  _OK!=(rc = subjo
310b0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a  urnalPage(pPg)).
310c0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
310d0 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
310e0 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20  TRACE(("MOVE %d 
310f0 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
31100 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
31110 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
31120 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
31130 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66  g->pgno, (pPg->f
31140 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
31150 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29  SYNC)?1:0, pgno)
31160 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d  );.  IOTRACE(("M
31170 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c  OVE %p %d %d\n",
31180 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
31190 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a  no, pgno))..  /*
311a0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
311b0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
311c0 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67 65  ()ed before page
311d0 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20   pPg->pgno can. 
311e0 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74   ** be written t
311f0 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67  o, store pPg->pg
31200 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  no in local vari
31210 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  able needSyncPgn
31220 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  o..  **.  ** If 
31230 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  the isCommit fla
31240 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65 20  g is set, there 
31250 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
31260 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a  member that.  **
31270 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
31280 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
31290 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
312a0 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
312b0 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72   .  ** can be wr
312c0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
312d0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
312e0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
312f0 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20   write to it..  
31300 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66  */.  if( (pPg->f
31310 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
31320 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d  SYNC) && !isComm
31330 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  it ){.    needSy
31340 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
31350 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
31360 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
31370 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e  g) || pPg->pgno>
31380 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
31390 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
313a0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
313b0 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20  DR_DIRTY );.    
313c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
313d0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
313e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
313f0 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
31400 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
31410 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
31420 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
31430 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
31440 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72  so, if the PgHdr
31450 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65  .needSync was se
31460 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  t for .  ** page
31470 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65   pgno before the
31480 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f   'move' operatio
31490 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  n, it needs to b
314a0 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a  e retained .  **
314b0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f   for the page mo
314c0 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ved there..  */.
314d0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
314e0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  ~PGHDR_NEED_SYNC
314f0 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  ;.  pPgOld = pag
31500 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
31510 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
31520 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50  t( !pPgOld || pP
31530 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  gOld->nRef==1 );
31540 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
31550 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
31560 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67  |= (pPgOld->flag
31570 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
31580 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  C);.    sqlite3P
31590 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64  cacheDrop(pPgOld
315a0 29 3b 0a 20 20 7d 0a 0a 20 20 6f 72 69 67 50 67  );.  }..  origPg
315b0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
315c0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
315d0 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a  ove(pPg, pgno);.
315e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
315f0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
31600 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
31610 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
31620 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
31630 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
31640 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
31650 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
31660 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
31670 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
31680 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
31690 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
316a0 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
316b0 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
316c0 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
316d0 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
316e0 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
316f0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
31700 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69  d the .    ** "i
31710 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74  s journaled" bit
31720 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  vec flag has bee
31730 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
31740 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
31750 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69   by.    ** loadi
31760 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
31770 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
31780 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
31790 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
317a0 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20  .    ** flag..  
317b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
317c0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
317d0 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
317e0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
317f0 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
31800 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
31810 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
31820 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
31830 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
31840 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
31850 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
31860 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
31870 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
31880 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
31890 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
318a0 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
318b0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
318c0 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
318d0 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
318e0 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
318f0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
31900 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
31910 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
31920 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
31930 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
31940 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
31950 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
31960 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
31970 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
31980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
31990 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
319a0 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
319b0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
319c0 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
319d0 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a    */.    PgHdr *
319e0 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
319f0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
31a00 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
31a10 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
31a20 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
31a30 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
31a40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31a50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31a60 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
31a70 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
31a80 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
31a90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31aa0 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a  pTmpSpace!=0 );.
31ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
31ac0 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65  itvecClear(pPage
31ad0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e  r->pInJournal, n
31ae0 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61  eedSyncPgno, pPa
31af0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
31b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
31b10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
31b20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
31b30 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73  Sync = 1;.    as
31b40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f  sert( pPager->no
31b50 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44  Sync==0 && !MEMD
31b60 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  B );.    pPgHdr-
31b70 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
31b80 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73  NEED_SYNC;.    s
31b90 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
31ba0 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
31bb0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
31bc0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
31bd0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72  }..  /*.  ** For
31be0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
31bf0 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72  tabase, make sur
31c00 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
31c10 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20  age continues.  
31c20 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20  ** to exist, in 
31c30 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63  case the transac
31c40 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f  tion needs to ro
31c50 6c 6c 20 62 61 63 6b 2e 20 20 57 65 20 61 6c 6c  ll back.  We all
31c60 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
31c70 61 67 65 20 6e 6f 77 2c 20 69 6e 73 74 65 61 64  age now, instead
31c80 20 6f 66 20 61 74 20 72 6f 6c 6c 62 61 63 6b 2c   of at rollback,
31c90 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 20   because we can 
31ca0 62 65 74 74 65 72 20 64 65 61 6c 0a 20 20 2a 2a  better deal.  **
31cb0 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d   with an out-of-
31cc0 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6e 6f 77  memory error now
31cd0 2e 20 20 54 69 63 6b 65 74 20 23 33 37 36 31 2e  .  Ticket #3761.
31ce0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
31cf0 42 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20  B ){.    DbPage 
31d00 2a 70 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20  *pNew;.    rc = 
31d10 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
31d20 69 72 65 28 70 50 61 67 65 72 2c 20 6f 72 69 67  ire(pPager, orig
31d30 50 67 6e 6f 2c 20 26 70 4e 65 77 2c 20 31 29 3b  Pgno, &pNew, 1);
31d40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31d50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31d60 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76  sqlite3PcacheMov
31d70 65 28 70 50 67 2c 20 6f 72 69 67 50 67 6e 6f 29  e(pPg, origPgno)
31d80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
31d90 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  c;.    }.    sql
31da0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
31db0 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  New);.  }..  ret
31dc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
31dd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
31de0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
31df0 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  to the data for 
31e00 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
31e10 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
31e20 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
31e30 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
31e40 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
31e50 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61  ef>0 || pPg->pPa
31e60 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20  ger->memDb );.  
31e70 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74  return pPg->pDat
31e80 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  a;.}../*.** Retu
31e90 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
31ea0 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
31eb0 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
31ec0 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
31ed0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
31ee0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
31ef0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
31f00 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
31f10 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
31f20 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
31f30 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Extra;.}../*.** 
31f40 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
31f50 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
31f60 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
31f70 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
31f80 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
31f90 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
31fa0 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
31fb0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
31fc0 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
31fd0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
31fe0 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
31ff0 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
32000 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
32010 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
32020 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
32030 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
32040 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
32050 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
32060 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
32070 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
32080 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
32090 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
320a0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
320b0 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
320c0 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
320d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
320e0 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
320f0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
32100 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
32110 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
32120 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
32130 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
32140 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
32150 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
32160 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
32170 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
32180 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
32190 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
321a0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
321b0 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
321c0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
321d0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
321e0 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
321f0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
32200 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
32210 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
32220 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32230 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
32240 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
32250 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20  u8)eMode;.  }.  
32260 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
32270 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
32280 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
32290 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  set the journal-
322a0 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
322b0 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
322c0 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
322d0 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41   of:.**.**    PA
322e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
322f0 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45  QUERY.**    PAGE
32300 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
32310 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  LETE.**    PAGER
32320 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
32330 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  NCATE.**    PAGE
32340 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
32350 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45  RSIST.**    PAGE
32360 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
32370 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  F.**    PAGER_JO
32380 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
32390 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
323a0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
323b0 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20  QUERY, then the 
323c0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69 73 20  journal_mode is 
323d0 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61  set to the.** va
323e0 6c 75 65 20 73 70 65 63 69 66 69 65 64 20 69 66  lue specified if
323f0 20 74 68 65 20 63 68 61 6e 67 65 20 69 73 20 61   the change is a
32400 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20 63 68 61  llowed.  The cha
32410 6e 67 65 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  nge is disallowe
32420 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f 6c  d.** for the fol
32430 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a  lowing reasons:.
32440 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e  **.**   *  An in
32450 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
32460 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69   can only have i
32470 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  ts journal_mode 
32480 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20  set to _OFF.**  
32490 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a      or _MEMORY..
324a0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6a  **.**   *  The j
324b0 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79 20  ournal mode may 
324c0 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 20 77  not be changed w
324d0 68 69 6c 65 20 61 20 74 72 61 6e 73 61 63 74 69  hile a transacti
324e0 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
324f0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
32500 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75   indicate the cu
32510 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20  rrent (possibly 
32520 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c  updated) journal
32530 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
32540 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
32550 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  lMode(Pager *pPa
32560 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
32570 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
32580 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
32590 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
325a0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
325b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
325c0 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
325d0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
325e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
325f0 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20  _TRUNCATE.      
32600 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
32610 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32620 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
32630 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
32640 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32650 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
32660 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
32670 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
32680 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73 73 65 72  EMORY );.  asser
32690 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
326a0 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
326b0 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 0a 20    if( eMode>=0. 
326c0 20 20 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20    && (!MEMDB || 
326d0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
326e0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
326f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
32700 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
32710 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a  OURNALMODE_OFF).
32720 20 20 20 26 26 20 21 70 50 61 67 65 72 2d 3e 64     && !pPager->d
32730 62 4d 6f 64 69 66 69 65 64 0a 20 20 20 26 26 20  bModified.   && 
32740 28 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  (!isOpen(pPager-
32750 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67  >jfd) || 0==pPag
32760 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a  er->journalOff).
32770 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f    ){.    if( isO
32780 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32790 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
327a0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
327b0 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >jfd);.    }.   
327c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
327d0 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
327e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
327f0 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
32800 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalMode;.}../*.*
32810 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69  * Get/set the si
32820 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f  ze-limit used fo
32830 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
32840 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
32850 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20 73 69  * Setting the si
32860 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d  ze limit to -1 m
32870 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73  eans no limit is
32880 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e   enforced..** An
32890 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   attempt to set 
328a0 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20  a limit smaller 
328b0 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d  than -1 is a no-
328c0 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  op..*/.i64 sqlit
328d0 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
328e0 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  zeLimit(Pager *p
328f0 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69  Pager, i64 iLimi
32900 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  t){.  if( iLimit
32910 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67  >=-1 ){.    pPag
32920 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
32930 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20  imit = iLimit;. 
32940 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
32950 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
32960 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  imit;.}../*.** R
32970 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
32980 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  to the pPager->p
32990 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e  Backup variable.
329a0 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75   The backup modu
329b0 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e  le.** in backup.
329c0 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20  c maintains the 
329d0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
329e0 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d  variable. This m
329f0 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74  odule.** uses it
32a00 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20   opaquely as an 
32a10 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
32a20 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
32a30 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
32a40 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 29 20  3BackupUpdate() 
32a50 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  only..*/.sqlite3
32a60 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65  _backup **sqlite
32a70 33 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28  3PagerBackupPtr(
32a80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32a90 20 20 72 65 74 75 72 6e 20 26 70 50 61 67 65 72    return &pPager
32aa0 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 65  ->pBackup;.}..#e
32ab0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32ac0 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a        MIT_DISKIO */.